Quiq
view release on metacpan or search on metacpan
lib/Quiq/Sql.pm view on Meta::CPAN
$constraintName = $table.'_PK';
$self->checkName(\$constraintName);
}
# Statement generieren
my ($oracle,$postgresql,$sqlite,$mysql) = $self->dbmsTestVector;
my $stmt;
if ($oracle || $postgresql) {
$stmt = sprintf "ALTER TABLE %s ADD\n".
" CONSTRAINT %s\n".
" PRIMARY KEY (%s)",
$tableName,$constraintName,join(', ',@$colNameA);
if ($tableSpace) {
$stmt .= "\n USING INDEX TABLESPACE $tableSpace";
}
if ($oracle && $exceptionTable) {
$stmt .= "\n EXCEPTIONS INTO $exceptionTable";
}
}
else {
die;
}
return $stmt;
}
# -----------------------------------------------------------------------------
=head3 addForeignKeyConstraint() - Generiere FOREIGN KEY Constraint Statement
=head4 Synopsis
$stmt = $sql->addForeignKeyConstraint($tableName,\@tableCols,
$refTableName,@opt);
=head4 Options
=over 4
=item -constraintName => $str (Default: <TABLE>_FK_<REFTABLE>)
Name des Constraint.
=item -defer => $bool (Default: 0)
Constraint-Fehler wird verzögert gemeldet.
=item -disable => $bool (Default: 0)
Constraint wird erzeugt, ist aber abgeschaltet.
=item -exceptionTable => $tableName (Default: keiner)
Constraint-Verletzende Datensätze werden in Tabelle $tableName
protokollliert (nur Oracle).
=item -onDelete => 'cascade'|'null' (Default: keiner)
Legt fest, was bei Löschung des Parent-Datensatzes passieren soll.
=item -refTableCols => \@refTableCols (Default: undef)
Liste der Kolumnen in der referenzierten Tabelle.
Bei MySQL müssen die referenzierten Kolumnen aufgezählt werden, auch wenn
ein Primary Key auf der referenzierten Tabelle definiert ist.
=back
=head4 Description
B<Oracle Syntax>
ALTER TABLE <TABLE_NAME> ADD
CONSTRAINT <CONSTRAINT_NAME>
FOREIGN KEY (<TABLE_COLUMNS>)
REFERENCES <REF_TABLE_NAME>
ON DELETE <ACTION>
DEFERRABLE INITIALLY DEFERRED
EXCEPTIONS INTO <EXCEPTION_TABLE_NAME>
DISABLE
B<PostgreSQL Syntax>
ALTER TABLE <TABLE_NAME> ADD
CONSTRAINT <CONSTRAINT_NAME>
FOREIGN KEY (<TABLE_COLUMNS>)
REFERENCES <REF_TABLE_NAME>
ON DELETE <ACTION>
DEFERRABLE INITIALLY DEFERRED
B<MySQL Syntax>
ALTER TABLE <TABLE_NAME> ADD
CONSTRAINT <CONSTRAINT_NAME>
FOREIGN KEY (<TABLE_COLUMNS>)
REFERENCES <REF_TABLE_NAME> (REF_TABLE_COLUMNS)
ON DELETE <ACTION>
=cut
# -----------------------------------------------------------------------------
sub addForeignKeyConstraint {
my $self = shift;
my $fromName = shift;
my $cols = shift;
my $toName = shift;
# Optionen
my $constraintName = undef;
my $defer = 0;
my $disable = 0;
my $exceptionTable = undef;
my $onDelete = undef;
my $refTableColumns = undef;
lib/Quiq/Sql.pm view on Meta::CPAN
my $body = Quiq::String->removeIndentation(shift);
my ($oracle,$postgresql,$sqlite,$mysql) = $self->dbmsTestVector;
my $stmt;
if ($postgresql) {
$stmt = 'CREATE';
if ($replace) {
$stmt .= ' OR REPLACE';
}
$stmt .= " FUNCTION $signature";
if ($returns) {
$stmt .= "\nRETURNS $returns";
}
$stmt .= "\nAS \$SQL\$";
$stmt .= "\n$body";
$stmt .= "\n\$SQL\$ LANGUAGE plpgsql";
}
else {
$self->throw('Not implemented');
}
return $stmt;
}
# -----------------------------------------------------------------------------
=head3 dropFunction() - Generiere Statement zum Entfernen einer Funktion
=head4 Synopsis
$stmt = $sql->dropFunction($signature);
=head4 Arguments
=over 4
=item $signature
Signatur der Funktion, also Name mit Typ-Parameterliste und ggf.
Schema-Präfix.
=back
=head4 Description
B<PostgreSQL>
DROP FUNCTION <signature> CASCADE
=cut
# -----------------------------------------------------------------------------
sub dropFunction {
my $self = shift;
# @_: $signature,@opt
# Argumente
my $cascade = 0;
Quiq::Option->extract(\@_,
-cascade => \$cascade,
);
my $signature = shift;
my ($oracle,$postgresql,$sqlite,$mysql) = $self->dbmsTestVector;
if ($postgresql) {
my $stmt = "DROP FUNCTION $signature";
if ($cascade) {
$stmt .= ' CASCADE';
}
return $stmt;
}
$self->throw('Not implemented');
}
# -----------------------------------------------------------------------------
=head3 moveFunction() - Bewege Funktion in ein anderes Schema
=head4 Synopsis
$stmt = $sql->moveFunction($signature,$schema);
=head4 Arguments
=over 4
=item $signature
Signatur der Funktion, also Name mit Typ-Parameterliste und
Schema-Präfix.
=item $schema
Zielschema, in das die Funktion bewegt wird.
=back
=head4 Description
B<PostgreSQL>
ALTER FUNCTION <signature> SET SCHEMA <schema>
=cut
# -----------------------------------------------------------------------------
sub moveFunction {
my ($self,$signature,$schema) = @_;
my ($oracle,$postgresql,$sqlite,$mysql) = $self->dbmsTestVector;
if ($postgresql) {
return "ALTER FUNCTION $signature SET SCHEMA $schema";
}
$self->throw('Not implemented');
}
# -----------------------------------------------------------------------------
=head2 Trigger
=head3 createTrigger() - Generiere Statement zum Erzeugen eines Triggers
=head4 Synopsis
( run in 0.800 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )