mirror of
https://github.com/postgres/postgres.git
synced 2025-04-20 00:42:27 +03:00
Upgrade to even newer ora2pg 2.0.
This commit is contained in:
parent
ffab4fdf24
commit
a24104eb5e
@ -60,7 +60,34 @@
|
|||||||
- Fix a problem with local settings regarding decimal separator (all ,
|
- Fix a problem with local settings regarding decimal separator (all ,
|
||||||
are changed to .) Thank to Jan Kester.
|
are changed to .) Thank to Jan Kester.
|
||||||
|
|
||||||
Thanks for all congratulation message and bug report I received.
|
2002 09 27 - Version 1.11
|
||||||
|
- Fix a problem when retrieving package+package body. Thanks to Mike WILHELM-HILTZ
|
||||||
|
- Set LongReadLen to 100000 when exporting table information. Many users reports
|
||||||
|
this kind of error: A-01406 LongReadLen too small and/or LongTruncOk not set
|
||||||
|
This should fix the problem else you must increase the value (around line 422 of Ora2Pg.pm.
|
||||||
|
- Filtering by owner for better performance when retreiving database schema. Thanks to Jefferson MEDEIROS
|
||||||
|
|
||||||
|
2002 12 03 - Version 1.12
|
||||||
|
|
||||||
|
I have fixed 2 bugs when using it against Oracle 817R3 on linux.
|
||||||
|
|
||||||
|
- Fix problem regarding RI constraints, the owner name was not
|
||||||
|
getting into the sql statement. Thank to Ian Boston.
|
||||||
|
|
||||||
|
- Moved all the RI constraints out of the create table statement.
|
||||||
|
Thank to Ian Boston for this contribution. This was a major request
|
||||||
|
from Ora2pg users.
|
||||||
|
|
||||||
|
2002 12 26 - Version 2.0
|
||||||
|
|
||||||
|
- Clean code.
|
||||||
|
- Fix COPY output on column value with end of line and add column naming.
|
||||||
|
- Add support to the PostgreSQL 7.3 schema. So Oracle schema can now be exported.
|
||||||
|
(see export_schema init option)
|
||||||
|
- Remove data extraction limit (old default: 10) so each tuple will be dump by default.
|
||||||
|
|
||||||
|
|
||||||
|
Thanks for all congratulation message and bug report+fix I received.
|
||||||
|
|
||||||
Gilles DAROLD <gilles@darold.net>
|
Gilles DAROLD <gilles@darold.net>
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ use POSIX qw(locale_h);
|
|||||||
setlocale(LC_NUMERIC,"C");
|
setlocale(LC_NUMERIC,"C");
|
||||||
|
|
||||||
|
|
||||||
$VERSION = "1.9";
|
$VERSION = "1.12";
|
||||||
$PSQL = "psql";
|
$PSQL = "psql";
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
@ -107,6 +107,9 @@ This schema definition can also be needed when you want to export data. If expor
|
|||||||
failed and complain that the table doesn't exists use this to prefix the table name
|
failed and complain that the table doesn't exists use this to prefix the table name
|
||||||
by the schema name.
|
by the schema name.
|
||||||
|
|
||||||
|
If you want to use PostgreSQL 7.3 schema support activate the init option
|
||||||
|
'export_schema' set to 1. Default is no schema export
|
||||||
|
|
||||||
To know at which indices tables can be found during extraction use the option:
|
To know at which indices tables can be found during extraction use the option:
|
||||||
|
|
||||||
showtableid => 1
|
showtableid => 1
|
||||||
@ -215,6 +218,7 @@ Features must include:
|
|||||||
with unique, primary and foreign key.
|
with unique, primary and foreign key.
|
||||||
- Grants/privileges export by user and group.
|
- Grants/privileges export by user and group.
|
||||||
- Table selection (by name and max table) export.
|
- Table selection (by name and max table) export.
|
||||||
|
- Export Oracle schema to PostgreSQL 7.3 schema.
|
||||||
- Predefined functions/triggers/procedures/packages export.
|
- Predefined functions/triggers/procedures/packages export.
|
||||||
- Data export.
|
- Data export.
|
||||||
- Sql query converter (todo)
|
- Sql query converter (todo)
|
||||||
@ -244,11 +248,12 @@ Supported options are:
|
|||||||
- type : Type of data to extract, can be TABLE,VIEW,GRANT,SEQUENCE,
|
- type : Type of data to extract, can be TABLE,VIEW,GRANT,SEQUENCE,
|
||||||
TRIGGER,FUNCTION,PROCEDURE,DATA,COPY,PACKAGE
|
TRIGGER,FUNCTION,PROCEDURE,DATA,COPY,PACKAGE
|
||||||
- debug : Print the current state of the parsing
|
- debug : Print the current state of the parsing
|
||||||
|
- export_schema : Export Oracle schema to PostgreSQL 7.3 schema
|
||||||
- tables : Extract only the given tables (arrayref)
|
- tables : Extract only the given tables (arrayref)
|
||||||
- showtableid : Display only the table indice during extraction
|
- showtableid : Display only the table indice during extraction
|
||||||
- min : Indice to begin extraction. Default to 0
|
- min : Indice to begin extraction. Default to 0
|
||||||
- max : Indice to end extraction. Default to 0 mean no limits
|
- max : Indice to end extraction. Default to 0 mean no limits
|
||||||
- data_limit : Number max of tuples to return during data extraction (default 10)
|
- data_limit : Number max of tuples to return during data extraction (default 0 no limit)
|
||||||
|
|
||||||
Attempt that this list should grow a little more because all initialization is
|
Attempt that this list should grow a little more because all initialization is
|
||||||
done by this way.
|
done by this way.
|
||||||
@ -398,6 +403,9 @@ sub _init
|
|||||||
$self->{limited} = ();
|
$self->{limited} = ();
|
||||||
$self->{limited} = $options{tables} if ($options{tables});
|
$self->{limited} = $options{tables} if ($options{tables});
|
||||||
|
|
||||||
|
$self->{export_schema} = 0;
|
||||||
|
$self->{export_schema} = $options{export_schema} if ($options{export_schema});
|
||||||
|
|
||||||
$self->{schema} = '';
|
$self->{schema} = '';
|
||||||
$self->{schema} = $options{schema} if ($options{schema});
|
$self->{schema} = $options{schema} if ($options{schema});
|
||||||
|
|
||||||
@ -413,12 +421,13 @@ sub _init
|
|||||||
$self->{dbh}->{LongReadLen} = 0;
|
$self->{dbh}->{LongReadLen} = 0;
|
||||||
#$self->{dbh}->{LongTruncOk} = 1;
|
#$self->{dbh}->{LongTruncOk} = 1;
|
||||||
|
|
||||||
$self->{data_limit} = 10;
|
$self->{data_limit} = 0;
|
||||||
$self->{data_current} = 0;
|
$self->{data_current} = 0;
|
||||||
$self->{data_limit} = $options{data_limit} if (exists $options{data_limit});
|
$self->{data_limit} = $options{data_limit} if (exists $options{data_limit});
|
||||||
|
|
||||||
# Retreive all table informations
|
# Retreive all table informations
|
||||||
if (!exists $options{type} || ($options{type} eq 'TABLE') || ($options{type} eq 'DATA') || ($options{type} eq 'COPY')) {
|
if (!exists $options{type} || ($options{type} eq 'TABLE') || ($options{type} eq 'DATA') || ($options{type} eq 'COPY')) {
|
||||||
|
$self->{dbh}->{LongReadLen} = 100000;
|
||||||
$self->_tables();
|
$self->_tables();
|
||||||
} elsif ($options{type} eq 'VIEW') {
|
} elsif ($options{type} eq 'VIEW') {
|
||||||
$self->{dbh}->{LongReadLen} = 100000;
|
$self->{dbh}->{LongReadLen} = 100000;
|
||||||
@ -572,10 +581,10 @@ main hash of the database structure :
|
|||||||
It also call these other private subroutine to affect the main hash
|
It also call these other private subroutine to affect the main hash
|
||||||
of the database structure :
|
of the database structure :
|
||||||
|
|
||||||
@{$self->{tables}{$class_name}{column_info}} = $self->_column_info($class_name);
|
@{$self->{tables}{$class_name}{column_info}} = $self->_column_info($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{primary_key}} = $self->_primary_key($class_name);
|
@{$self->{tables}{$class_name}{primary_key}} = $self->_primary_key($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{unique_key}} = $self->_unique_key($class_name);
|
@{$self->{tables}{$class_name}{unique_key}} = $self->_unique_key($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{foreign_key}} = $self->_foreign_key($class_name);
|
@{$self->{tables}{$class_name}{foreign_key}} = $self->_foreign_key($class_name, $owner);
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
@ -605,27 +614,27 @@ print STDERR "Min table dump set to $self->{min}.\n" if ($self->{debug} && $self
|
|||||||
print STDERR "Max table dump set to $self->{max}.\n" if ($self->{debug} && $self->{max});
|
print STDERR "Max table dump set to $self->{max}.\n" if ($self->{debug} && $self->{max});
|
||||||
foreach my $t (@$table) {
|
foreach my $t (@$table) {
|
||||||
# Jump to desired extraction
|
# Jump to desired extraction
|
||||||
if (grep(/^${@$t}[2]$/, @done)) {
|
if (grep(/^$t->[2]$/, @done)) {
|
||||||
print STDERR "Duplicate entry found: ${@$t}[0] - ${@$t}[1] - ${@$t}[2]\n";
|
print STDERR "Duplicate entry found: $t->[0] - $t->[1] - $t->[2]\n";
|
||||||
} else {
|
} else {
|
||||||
push(@done, ${@$t}[2]);
|
push(@done, $t->[2]);
|
||||||
}
|
}
|
||||||
$i++, next if ($self->{min} && ($i < $self->{min}));
|
$i++, next if ($self->{min} && ($i < $self->{min}));
|
||||||
last if ($self->{max} && ($i > $self->{max}));
|
last if ($self->{max} && ($i > $self->{max}));
|
||||||
next if (($#{$self->{limited}} >= 0) && !grep(/^${@$t}[2]$/, @{$self->{limited}}));
|
next if (($#{$self->{limited}} >= 0) && !grep(/^$t->[2]$/, @{$self->{limited}}));
|
||||||
print STDERR "[$i] " if ($self->{max} || $self->{min});
|
print STDERR "[$i] " if ($self->{max} || $self->{min});
|
||||||
print STDERR "Scanning ${@$t}[2] (@$t)...\n" if ($self->{debug});
|
print STDERR "Scanning $t->[2] (@$t)...\n" if ($self->{debug});
|
||||||
|
|
||||||
# Check of uniqueness of the table
|
# Check of uniqueness of the table
|
||||||
if (exists $self->{tables}{${@$t}[2]}{field_name}) {
|
if (exists $self->{tables}{$t->[2]}{field_name}) {
|
||||||
print STDERR "Warning duplicate table ${@$t}[2], SYNONYME ? Skipped.\n";
|
print STDERR "Warning duplicate table $t->[2], SYNONYME ? Skipped.\n";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
# usually OWNER,TYPE. QUALIFIER is omitted until I know what to do with that
|
# usually OWNER,TYPE. QUALIFIER is omitted until I know what to do with that
|
||||||
$self->{tables}{${@$t}[2]}{table_info} = [(${@$t}[1],${@$t}[3])];
|
$self->{tables}{$t->[2]}{table_info} = [($t->[1],$t->[3])];
|
||||||
# Set the fields information
|
# Set the fields information
|
||||||
my $sth = $self->{dbh}->prepare("SELECT * FROM ${@$t}[1].${@$t}[2] WHERE 1=0");
|
my $sth = $self->{dbh}->prepare("SELECT * FROM $t->[1].$t->[2] WHERE 1=0");
|
||||||
if (!defined($sth)) {
|
if (!defined($sth)) {
|
||||||
warn "Can't prepare statement: $DBI::errstr";
|
warn "Can't prepare statement: $DBI::errstr";
|
||||||
next;
|
next;
|
||||||
@ -635,14 +644,14 @@ print STDERR "Scanning ${@$t}[2] (@$t)...\n" if ($self->{debug});
|
|||||||
warn "Can't execute statement: $DBI::errstr";
|
warn "Can't execute statement: $DBI::errstr";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
$self->{tables}{${@$t}[2]}{field_name} = $sth->{NAME};
|
$self->{tables}{$t->[2]}{field_name} = $sth->{NAME};
|
||||||
$self->{tables}{${@$t}[2]}{field_type} = $sth->{TYPE};
|
$self->{tables}{$t->[2]}{field_type} = $sth->{TYPE};
|
||||||
|
|
||||||
@{$self->{tables}{${@$t}[2]}{column_info}} = $self->_column_info(${@$t}[2]);
|
@{$self->{tables}{$t->[2]}{column_info}} = $self->_column_info($t->[2],$t->[1]);
|
||||||
@{$self->{tables}{${@$t}[2]}{primary_key}} = $self->_primary_key(${@$t}[2]);
|
@{$self->{tables}{$t->[2]}{primary_key}} = $self->_primary_key($t->[2],$t->[1]);
|
||||||
@{$self->{tables}{${@$t}[2]}{unique_key}} = $self->_unique_key(${@$t}[2]);
|
@{$self->{tables}{$t->[2]}{unique_key}} = $self->_unique_key($t->[2],$t->[1]);
|
||||||
($self->{tables}{${@$t}[2]}{foreign_link}, $self->{tables}{${@$t}[2]}{foreign_key}) = $self->_foreign_key(${@$t}[2]);
|
($self->{tables}{$t->[2]}{foreign_link}, $self->{tables}{$t->[2]}{foreign_key}) = $self->_foreign_key($t->[2],$t->[1]);
|
||||||
($self->{tables}{${@$t}[2]}{uniqueness}, $self->{tables}{${@$t}[2]}{indexes}) = $self->_get_indexes(${@$t}[2]);
|
($self->{tables}{$t->[2]}{uniqueness}, $self->{tables}{$t->[2]}{indexes}) = $self->_get_indexes($t->[2],$t->[1]);
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -725,9 +734,13 @@ sub _get_sql_data
|
|||||||
# Process view only
|
# Process view only
|
||||||
if ($self->{type} eq 'VIEW') {
|
if ($self->{type} eq 'VIEW') {
|
||||||
print STDERR "Add views definition...\n" if ($self->{debug});
|
print STDERR "Add views definition...\n" if ($self->{debug});
|
||||||
|
if ($self->{export_schema}) {
|
||||||
|
$sql_output .= "SET search_path = $self->{schema}, pg_catalog;\n\n";
|
||||||
|
}
|
||||||
foreach my $view (sort keys %{$self->{views}}) {
|
foreach my $view (sort keys %{$self->{views}}) {
|
||||||
|
$self->{views}{$view}{text} =~ s/\s*WITH\s+.*$//s;
|
||||||
if (!@{$self->{views}{$view}{alias}}) {
|
if (!@{$self->{views}{$view}{alias}}) {
|
||||||
$sql_output .= "CREATE VIEW \"\L$view\E\" AS $self->{views}{$view}{text};\n";
|
$sql_output .= "CREATE VIEW \"\L$view\E\" AS \L$self->{views}{$view}{text};\n";
|
||||||
} else {
|
} else {
|
||||||
$sql_output .= "CREATE VIEW \"\L$view\E\" (";
|
$sql_output .= "CREATE VIEW \"\L$view\E\" (";
|
||||||
my $count = 0;
|
my $count = 0;
|
||||||
@ -737,9 +750,9 @@ print STDERR "Add views definition...\n" if ($self->{debug});
|
|||||||
} else {
|
} else {
|
||||||
$sql_output .= ", "
|
$sql_output .= ", "
|
||||||
}
|
}
|
||||||
$sql_output .= "$d->[0]";
|
$sql_output .= "\"\L$d->[0]\E\"";
|
||||||
}
|
}
|
||||||
$sql_output .= ") AS $self->{views}{$view}{text};\n";
|
$sql_output .= ") AS \L$self->{views}{$view}{text};\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -755,6 +768,9 @@ print STDERR "Add views definition...\n" if ($self->{debug});
|
|||||||
# Process grant only
|
# Process grant only
|
||||||
if ($self->{type} eq 'GRANT') {
|
if ($self->{type} eq 'GRANT') {
|
||||||
print STDERR "Add groups/users privileges...\n" if ($self->{debug});
|
print STDERR "Add groups/users privileges...\n" if ($self->{debug});
|
||||||
|
if ($self->{export_schema}) {
|
||||||
|
$sql_output .= "SET search_path = $self->{schema}, pg_catalog;\n\n";
|
||||||
|
}
|
||||||
# Add groups definition
|
# Add groups definition
|
||||||
my $groups = '';
|
my $groups = '';
|
||||||
my @users = ();
|
my @users = ();
|
||||||
@ -817,7 +833,10 @@ print STDERR "Add sequences definition...\n" if ($self->{debug});
|
|||||||
if ($seq->[1] < -2147483647) {
|
if ($seq->[1] < -2147483647) {
|
||||||
$seq->[1] = -2147483647;
|
$seq->[1] = -2147483647;
|
||||||
}
|
}
|
||||||
$sql_output .= "CREATE SEQUENCE \L$seq->[0]\E INCREMENT $seq->[3] MINVALUE $seq->[1] MAXVALUE $seq->[2] START $seq->[4] CACHE $cache$cycle;\n";
|
if ($self->{export_schema}) {
|
||||||
|
$sql_output .= "SET search_path = $self->{schema}, pg_catalog;\n\n";
|
||||||
|
}
|
||||||
|
$sql_output .= "CREATE SEQUENCE \"\L$seq->[0]\E\" INCREMENT $seq->[3] MINVALUE $seq->[1] MAXVALUE $seq->[2] START $seq->[4] CACHE $cache$cycle;\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$sql_output) {
|
if (!$sql_output) {
|
||||||
@ -838,7 +857,7 @@ print STDERR "Add triggers definition...\n" if ($self->{debug});
|
|||||||
chomp($trig->[4]);
|
chomp($trig->[4]);
|
||||||
# Check if it's a pg rule
|
# Check if it's a pg rule
|
||||||
if ($trig->[1] =~ /INSTEAD OF/) {
|
if ($trig->[1] =~ /INSTEAD OF/) {
|
||||||
$sql_output .= "CREATE RULE \L$trig->[0]\E AS\n\tON \L$trig->[3]\E\n\tDO INSTEAD\n(\n\t$trig->[4]\n);\n\n";
|
$sql_output .= "CREATE RULE \"\L$trig->[0]\E\" AS\n\tON \L$trig->[3]\E\n\tDO INSTEAD\n(\n\t$trig->[4]\n);\n\n";
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
#--------------------------------------------
|
#--------------------------------------------
|
||||||
@ -859,8 +878,11 @@ print STDERR "Add triggers definition...\n" if ($self->{debug});
|
|||||||
# Escaping Single Quotes
|
# Escaping Single Quotes
|
||||||
#$trig->[4] =~ s/'/''/sg;
|
#$trig->[4] =~ s/'/''/sg;
|
||||||
|
|
||||||
|
if ($self->{export_schema}) {
|
||||||
|
$sql_output .= "SET search_path = $self->{schema}, pg_catalog;\n\n";
|
||||||
|
}
|
||||||
$sql_output .= "CREATE FUNCTION pg_fct_\L$trig->[0]\E () RETURNS OPAQUE AS '\n$trig->[4]\n' LANGUAGE 'plpgsql'\n\n";
|
$sql_output .= "CREATE FUNCTION pg_fct_\L$trig->[0]\E () RETURNS OPAQUE AS '\n$trig->[4]\n' LANGUAGE 'plpgsql'\n\n";
|
||||||
$sql_output .= "CREATE TRIGGER \L$trig->[0]\E\n\t$trig->[1] $trig->[2] ON \L$trig->[3]\E FOR EACH ROW\n\tEXECUTE PROCEDURE pg_fct_\L$trig->[0]\E();\n\n";
|
$sql_output .= "CREATE TRIGGER \L$trig->[0]\E\n\t$trig->[1] $trig->[2] ON \"\L$trig->[3]\E\" FOR EACH ROW\n\tEXECUTE PROCEDURE pg_fct_\L$trig->[0]\E();\n\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -941,32 +963,53 @@ print STDERR "Add packages definition...\n" if ($self->{debug});
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($self->{export_schema}) {
|
||||||
|
if ($self->{dbhdest}) {
|
||||||
|
if ($self->{type} ne 'COPY') {
|
||||||
|
my $s = $self->{dbhdest}->prepare("SET search_path = $self->{schema}, pg_catalog") or die $self->{dbhdest}->errstr . "\n";
|
||||||
|
$s->execute or die $s->errstr . "\n";
|
||||||
|
} else {
|
||||||
|
print DBH "SET search_path = $self->{schema}, pg_catalog;\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($outfile) {
|
||||||
|
print FILE "SET search_path = $self->{schema}, pg_catalog;\n";
|
||||||
|
} else {
|
||||||
|
print "SET search_path = $self->{schema}, pg_catalog;\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach my $table (keys %{$self->{tables}}) {
|
foreach my $table (keys %{$self->{tables}}) {
|
||||||
print STDERR "Dumping table $table...\n" if ($self->{debug});
|
print STDERR "Dumping table $table...\n" if ($self->{debug});
|
||||||
my @tt = ();
|
my @tt = ();
|
||||||
my @nn = ();
|
my @nn = ();
|
||||||
my $s_out = "INSERT INTO \"\L$table\E\" (";
|
my $s_out = "INSERT INTO \"\L$table\E\" (";
|
||||||
if ($self->{type} eq 'COPY') {
|
if ($self->{type} eq 'COPY') {
|
||||||
$s_out = "COPY \"\L$table\E\" FROM stdin;\n";
|
$s_out = "\nCOPY \"\L$table\E\" ";
|
||||||
}
|
}
|
||||||
|
my @fname = ();
|
||||||
foreach my $i ( 0 .. $#{$self->{tables}{$table}{field_name}} ) {
|
foreach my $i ( 0 .. $#{$self->{tables}{$table}{field_name}} ) {
|
||||||
my $fieldname = ${$self->{tables}{$table}{field_name}}[$i];
|
my $fieldname = ${$self->{tables}{$table}{field_name}}[$i];
|
||||||
if (exists $self->{modify}{"\L$table\E"}) {
|
if (exists $self->{modify}{"\L$table\E"}) {
|
||||||
next if (!grep(/\L$fieldname\E/, @{$self->{modify}{"\L$table\E"}}));
|
next if (!grep(/$fieldname/i, @{$self->{modify}{"\L$table\E"}}));
|
||||||
}
|
}
|
||||||
|
push(@fname, lc($fieldname));
|
||||||
foreach my $f (@{$self->{tables}{$table}{column_info}}) {
|
foreach my $f (@{$self->{tables}{$table}{column_info}}) {
|
||||||
next if (${$f}[0] ne "$fieldname");
|
next if ($f->[0] ne "$fieldname");
|
||||||
my $type = $self->_sql_type(${$f}[1], ${$f}[2], ${$f}[5], ${$f}[6]);
|
my $type = $self->_sql_type($f->[1], $f->[2], $f->[5], $f->[6]);
|
||||||
$type = "${$f}[1], ${$f}[2]" if (!$type);
|
$type = "$f->[1], $f->[2]" if (!$type);
|
||||||
push(@tt, $type);
|
push(@tt, $type);
|
||||||
push(@nn, ${$f}[0]);
|
push(@nn, $f->[0]);
|
||||||
if ($self->{type} ne 'COPY') {
|
if ($self->{type} ne 'COPY') {
|
||||||
$s_out .= "\"\L${$f}[0]\E\",";
|
$s_out .= "\"\L$f->[0]\E\",";
|
||||||
}
|
}
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($self->{type} eq 'COPY') {
|
||||||
|
$s_out .= '(' . join(',', @fname) . ") FROM stdin;\n";
|
||||||
|
}
|
||||||
|
|
||||||
if ($self->{type} ne 'COPY') {
|
if ($self->{type} ne 'COPY') {
|
||||||
$s_out =~ s/,$//;
|
$s_out =~ s/,$//;
|
||||||
@ -1048,6 +1091,9 @@ print STDERR "Dumping table $table...\n" if ($self->{debug});
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
# remove end of line
|
||||||
|
$row->[$i] =~ s/\n/\\n/gs;
|
||||||
|
|
||||||
if ($tt[$i] !~ /(char|date|time|text)/) {
|
if ($tt[$i] !~ /(char|date|time|text)/) {
|
||||||
$row->[$i] =~ s/,/./;
|
$row->[$i] =~ s/,/./;
|
||||||
}
|
}
|
||||||
@ -1144,9 +1190,14 @@ print STDERR "Dumping table $table...\n" if ($self->{debug});
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Dump the database structure
|
# Dump the database structure
|
||||||
|
if ($self->{export_schema}) {
|
||||||
|
$sql_output .= "CREATE SCHEMA \L$self->{schema}\E;\n\n";
|
||||||
|
$sql_output .= "SET search_path = $self->{schema}, pg_catalog;\n\n";
|
||||||
|
}
|
||||||
foreach my $table (keys %{$self->{tables}}) {
|
foreach my $table (keys %{$self->{tables}}) {
|
||||||
print STDERR "Dumping table $table...\n" if ($self->{debug});
|
print STDERR "Dumping table $table...\n" if ($self->{debug});
|
||||||
$sql_output .= "CREATE ${$self->{tables}{$table}{table_info}}[1] \"\L$table\E\" (\n";
|
$sql_output .= "CREATE ${$self->{tables}{$table}{table_info}}[1] \"\L$table\E\" (\n";
|
||||||
@ -1154,24 +1205,24 @@ print STDERR "Dumping table $table...\n" if ($self->{debug});
|
|||||||
my $sql_pkey = "";
|
my $sql_pkey = "";
|
||||||
foreach my $i ( 0 .. $#{$self->{tables}{$table}{field_name}} ) {
|
foreach my $i ( 0 .. $#{$self->{tables}{$table}{field_name}} ) {
|
||||||
foreach my $f (@{$self->{tables}{$table}{column_info}}) {
|
foreach my $f (@{$self->{tables}{$table}{column_info}}) {
|
||||||
next if (${$f}[0] ne "${$self->{tables}{$table}{field_name}}[$i]");
|
next if ($f->[0] ne "${$self->{tables}{$table}{field_name}}[$i]");
|
||||||
my $type = $self->_sql_type(${$f}[1], ${$f}[2], ${$f}[5], ${$f}[6]);
|
my $type = $self->_sql_type($f->[1], $f->[2], $f->[5], $f->[6]);
|
||||||
$type = "${$f}[1], ${$f}[2]" if (!$type);
|
$type = "$f->[1], $f->[2]" if (!$type);
|
||||||
$sql_output .= "\t\"\L${$f}[0]\E\" $type";
|
$sql_output .= "\t\"\L$f->[0]\E\" $type";
|
||||||
# Set the primary key definition
|
# Set the primary key definition
|
||||||
foreach my $k (@{$self->{tables}{$table}{primary_key}}) {
|
foreach my $k (@{$self->{tables}{$table}{primary_key}}) {
|
||||||
next if ($k ne "${$f}[0]");
|
next if ($k ne "$f->[0]");
|
||||||
$sql_pkey .= "\"\L$k\E\",";
|
$sql_pkey .= "\"\L$k\E\",";
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
if (${$f}[4] ne "") {
|
if ($f->[4] ne "") {
|
||||||
$sql_output .= " DEFAULT ${$f}[4]";
|
$sql_output .= " DEFAULT $f->[4]";
|
||||||
} elsif (!${$f}[3] || (${$f}[3] eq 'N')) {
|
} elsif (!$f->[3] || ($f->[3] eq 'N')) {
|
||||||
$sql_output .= " NOT NULL";
|
$sql_output .= " NOT NULL";
|
||||||
}
|
}
|
||||||
# Set the unique key definition
|
# Set the unique key definition
|
||||||
foreach my $k (@{$self->{tables}{$table}{unique_key}}) {
|
foreach my $k (@{$self->{tables}{$table}{unique_key}}) {
|
||||||
next if ( ($k ne "${$f}[0]") || (grep(/^$k$/, @{$self->{tables}{$table}{primary_key}})) );
|
next if ( ($k ne "$f->[0]") || (grep(/^$k$/, @{$self->{tables}{$table}{primary_key}})) );
|
||||||
$sql_ukey .= "\"\L$k\E\",";
|
$sql_ukey .= "\"\L$k\E\",";
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
@ -1183,6 +1234,23 @@ print STDERR "Dumping table $table...\n" if ($self->{debug});
|
|||||||
$sql_pkey =~ s/,$//;
|
$sql_pkey =~ s/,$//;
|
||||||
$sql_output .= "\tUNIQUE ($sql_ukey),\n" if ($sql_ukey);
|
$sql_output .= "\tUNIQUE ($sql_ukey),\n" if ($sql_ukey);
|
||||||
$sql_output .= "\tPRIMARY KEY ($sql_pkey),\n" if ($sql_pkey);
|
$sql_output .= "\tPRIMARY KEY ($sql_pkey),\n" if ($sql_pkey);
|
||||||
|
$sql_output =~ s/,$//;
|
||||||
|
$sql_output .= ");\n";
|
||||||
|
foreach my $idx (keys %{$self->{tables}{$table}{indexes}}) {
|
||||||
|
map { s/^/"/ } @{$self->{tables}{$table}{indexes}{$idx}};
|
||||||
|
map { s/$/"/ } @{$self->{tables}{$table}{indexes}{$idx}};
|
||||||
|
my $columns = join(',', @{$self->{tables}{$table}{indexes}{$idx}});
|
||||||
|
my $unique = '';
|
||||||
|
$unique = ' UNIQUE' if ($self->{tables}{$table}{uniqueness}{$idx} eq 'UNIQUE');
|
||||||
|
$sql_output .= "CREATE$unique INDEX \L$idx\E ON \"\L$table\E\" (\L$columns\E);\n";
|
||||||
|
}
|
||||||
|
$sql_output .= "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $table (keys %{$self->{tables}}) {
|
||||||
|
print STDERR "Dumping RI $table...\n" if ($self->{debug});
|
||||||
|
my $sql_ukey = "";
|
||||||
|
my $sql_pkey = "";
|
||||||
|
|
||||||
# Add constraint definition
|
# Add constraint definition
|
||||||
my @done = ();
|
my @done = ();
|
||||||
@ -1193,24 +1261,13 @@ print STDERR "Dumping table $table...\n" if ($self->{debug});
|
|||||||
$desttable .= "$_";
|
$desttable .= "$_";
|
||||||
}
|
}
|
||||||
push(@done, $h->[0]);
|
push(@done, $h->[0]);
|
||||||
$sql_output .= "\tCONSTRAINT \L$h->[0]\E FOREIGN KEY (" . lc(join(',', @{$self->{tables}{$table}{foreign_link}{$h->[0]}{local}})) . ") REFERENCES \L$desttable\E (" . lc(join(',', @{$self->{tables}{$table}{foreign_link}{$h->[0]}{remote}{$desttable}})) . ")";
|
$sql_output .= "ALTER TABLE \"\L$table\E\" ADD CONSTRAINT \L$h->[0]\E FOREIGN KEY (" . lc(join(',', @{$self->{tables}{$table}{foreign_link}{$h->[0]}{local}})) . ") REFERENCES \L$desttable\E (" . lc(join(',', @{$self->{tables}{$table}{foreign_link}{$h->[0]}{remote}{$desttable}})) . ")";
|
||||||
$sql_output .= " MATCH $h->[2]" if ($h->[2]);
|
$sql_output .= " MATCH $h->[2]" if ($h->[2]);
|
||||||
$sql_output .= " ON DELETE $h->[3]";
|
$sql_output .= " ON DELETE $h->[3]";
|
||||||
$sql_output .= " $h->[4]";
|
$sql_output .= " $h->[4]";
|
||||||
$sql_output .= " INITIALLY $h->[5],\n";
|
$sql_output .= " INITIALLY $h->[5];\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
$sql_output =~ s/,$//;
|
|
||||||
$sql_output .= ");\n";
|
|
||||||
foreach my $idx (keys %{$self->{tables}{$table}{indexes}}) {
|
|
||||||
map { s/^/"/ } @{$self->{tables}{$table}{indexes}{$idx}};
|
|
||||||
map { s/$/"/ } @{$self->{tables}{$table}{indexes}{$idx}};
|
|
||||||
my $columns = join(',', @{$self->{tables}{$table}{indexes}{$idx}});
|
|
||||||
my $unique = '';
|
|
||||||
$unique = ' UNIQUE' if ($self->{tables}{$table}{uniqueness}{$idx} eq 'UNIQUE');
|
|
||||||
$sql_output .= "CREATE$unique INDEX \"\L$idx\E\" ON \"\L$table\E\" (\L$columns\E);\n";
|
|
||||||
}
|
|
||||||
$sql_output .= "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$sql_output) {
|
if (!$sql_output) {
|
||||||
@ -1287,7 +1344,7 @@ sub _sql_type
|
|||||||
my %TYPE = (
|
my %TYPE = (
|
||||||
# Oracle only has one flexible underlying numeric type, NUMBER.
|
# Oracle only has one flexible underlying numeric type, NUMBER.
|
||||||
# Without precision and scale it is set to PG type float8 to match all needs
|
# Without precision and scale it is set to PG type float8 to match all needs
|
||||||
'NUMBER' => 'float8',
|
'NUMBER' => 'numeric',
|
||||||
# CHAR types limit of 2000 bytes with default to 1 if no length is given.
|
# CHAR types limit of 2000 bytes with default to 1 if no length is given.
|
||||||
# PG char type has max length set to 8104 so it should match all needs
|
# PG char type has max length set to 8104 so it should match all needs
|
||||||
'CHAR' => 'char',
|
'CHAR' => 'char',
|
||||||
@ -1299,8 +1356,8 @@ sub _sql_type
|
|||||||
'VARCHAR2' => 'varchar',
|
'VARCHAR2' => 'varchar',
|
||||||
'NVARCHAR2' => 'varchar',
|
'NVARCHAR2' => 'varchar',
|
||||||
# The DATE data type is used to store the date and time information.
|
# The DATE data type is used to store the date and time information.
|
||||||
# Pg type datetime should match all needs
|
# Pg type timestamp should match all needs
|
||||||
'DATE' => 'datetime',
|
'DATE' => 'timestamp',
|
||||||
# Type LONG is like VARCHAR2 but with up to 2Gb.
|
# Type LONG is like VARCHAR2 but with up to 2Gb.
|
||||||
# PG type text should match all needs or if you want you could use blob
|
# PG type text should match all needs or if you want you could use blob
|
||||||
'LONG' => 'text', # Character data of variable length
|
'LONG' => 'text', # Character data of variable length
|
||||||
@ -1315,7 +1372,7 @@ sub _sql_type
|
|||||||
# Pg type text should match all needs or if you want you could use blob (large object)
|
# Pg type text should match all needs or if you want you could use blob (large object)
|
||||||
'RAW' => 'text',
|
'RAW' => 'text',
|
||||||
'ROWID' => 'oid',
|
'ROWID' => 'oid',
|
||||||
'LONG RAW' => 'binary',
|
'LONG RAW' => 'text',
|
||||||
'FLOAT' => 'float8'
|
'FLOAT' => 'float8'
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1354,7 +1411,7 @@ sub _sql_type
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
=head2 _column_info TABLE
|
=head2 _column_info TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native column information.
|
This function implements a Oracle-native column information.
|
||||||
|
|
||||||
@ -1373,12 +1430,14 @@ for each column the given a table
|
|||||||
|
|
||||||
sub _column_info
|
sub _column_info
|
||||||
{
|
{
|
||||||
my ($self, $table) = @_;
|
my ($self, $table, $owner) = @_;
|
||||||
|
|
||||||
|
$owner = "AND OWNER='$owner' " if ($owner);
|
||||||
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
||||||
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT, DATA_PRECISION, DATA_SCALE
|
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT, DATA_PRECISION, DATA_SCALE
|
||||||
FROM DBA_TAB_COLUMNS
|
FROM DBA_TAB_COLUMNS
|
||||||
WHERE TABLE_NAME='$table'
|
WHERE TABLE_NAME='$table' $owner
|
||||||
|
ORDER BY COLUMN_ID
|
||||||
END
|
END
|
||||||
$sth->execute or die $sth->errstr;
|
$sth->execute or die $sth->errstr;
|
||||||
my $data = $sth->fetchall_arrayref();
|
my $data = $sth->fetchall_arrayref();
|
||||||
@ -1393,7 +1452,7 @@ print STDERR "\t$d->[0] => type:$d->[1] , length:$d->[2], precision:$d->[5], sca
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
=head2 _primary_key TABLE
|
=head2 _primary_key TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native primary key column
|
This function implements a Oracle-native primary key column
|
||||||
information.
|
information.
|
||||||
@ -1405,27 +1464,28 @@ for the given table.
|
|||||||
|
|
||||||
sub _primary_key
|
sub _primary_key
|
||||||
{
|
{
|
||||||
my($self, $table) = @_;
|
my ($self, $table, $owner) = @_;
|
||||||
|
|
||||||
|
$owner = "AND all_constraints.OWNER='$owner' AND all_cons_columns.OWNER=all_constraints.OWNER" if ($owner);
|
||||||
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
||||||
select all_cons_columns.COLUMN_NAME
|
SELECT all_cons_columns.COLUMN_NAME
|
||||||
from all_constraints, all_cons_columns
|
FROM all_constraints, all_cons_columns
|
||||||
where all_constraints.CONSTRAINT_TYPE='P'
|
WHERE all_constraints.CONSTRAINT_TYPE='P'
|
||||||
and all_constraints.constraint_name=all_cons_columns.constraint_name
|
AND all_constraints.constraint_name=all_cons_columns.constraint_name
|
||||||
and all_constraints.STATUS='ENABLED'
|
AND all_constraints.STATUS='ENABLED'
|
||||||
and all_constraints.TABLE_NAME='$table'
|
AND all_constraints.TABLE_NAME='$table' $owner
|
||||||
order by all_cons_columns.position
|
ORDER BY all_cons_columns.position
|
||||||
END
|
END
|
||||||
$sth->execute or die $sth->errstr;
|
$sth->execute or die $sth->errstr;
|
||||||
my @data = ();
|
my @data = ();
|
||||||
while (my $row = $sth->fetch) {
|
while (my $row = $sth->fetch) {
|
||||||
push(@data, ${@$row}[0]) if (${@$row}[0] !~ /\$/);
|
push(@data, $row->[0]) if ($row->[0] !~ /\$/);
|
||||||
}
|
}
|
||||||
return @data;
|
return @data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
=head2 _unique_key TABLE
|
=head2 _unique_key TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native unique key column
|
This function implements a Oracle-native unique key column
|
||||||
information.
|
information.
|
||||||
@ -1437,28 +1497,29 @@ for the given table.
|
|||||||
|
|
||||||
sub _unique_key
|
sub _unique_key
|
||||||
{
|
{
|
||||||
my($self, $table) = @_;
|
my($self, $table, $owner) = @_;
|
||||||
|
|
||||||
|
$owner = "AND all_constraints.OWNER='$owner'" if ($owner);
|
||||||
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
||||||
select all_cons_columns.COLUMN_NAME
|
SELECT all_cons_columns.COLUMN_NAME
|
||||||
from all_constraints, all_cons_columns
|
FROM all_constraints, all_cons_columns
|
||||||
where all_constraints.CONSTRAINT_TYPE='U'
|
WHERE all_constraints.CONSTRAINT_TYPE='U'
|
||||||
and all_constraints.constraint_name=all_cons_columns.constraint_name
|
AND all_constraints.constraint_name=all_cons_columns.constraint_name
|
||||||
and all_constraints.STATUS='ENABLED'
|
AND all_constraints.STATUS='ENABLED'
|
||||||
and all_constraints.TABLE_NAME='$table'
|
AND all_constraints.TABLE_NAME='$table' $owner
|
||||||
order by all_cons_columns.position
|
ORDER BY all_cons_columns.position
|
||||||
END
|
END
|
||||||
$sth->execute or die $sth->errstr;
|
$sth->execute or die $sth->errstr;
|
||||||
|
|
||||||
my @data = ();
|
my @data = ();
|
||||||
while (my $row = $sth->fetch) {
|
while (my $row = $sth->fetch) {
|
||||||
push(@data, ${@$row}[0]) if (${@$row}[0] !~ /\$/);
|
push(@data, $row->[0]) if ($row->[0] !~ /\$/);
|
||||||
}
|
}
|
||||||
return @data;
|
return @data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
=head2 _foreign_key TABLE
|
=head2 _foreign_key TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native foreign key reference
|
This function implements a Oracle-native foreign key reference
|
||||||
information.
|
information.
|
||||||
@ -1483,10 +1544,16 @@ Just like this:
|
|||||||
|
|
||||||
sub _foreign_key
|
sub _foreign_key
|
||||||
{
|
{
|
||||||
my ($self, $table) = @_;
|
my ($self, $table, $owner) = @_;
|
||||||
|
|
||||||
my $str = "SELECT CONSTRAINT_NAME,R_CONSTRAINT_NAME,SEARCH_CONDITION,DELETE_RULE,DEFERRABLE,DEFERRED FROM DBA_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND STATUS='ENABLED' AND TABLE_NAME='$table'";
|
$owner = "AND OWNER='$owner'" if ($owner);
|
||||||
my $sth = $self->{dbh}->prepare($str) or die $self->{dbh}->errstr;
|
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
||||||
|
SELECT CONSTRAINT_NAME,R_CONSTRAINT_NAME,SEARCH_CONDITION,DELETE_RULE,DEFERRABLE,DEFERRED,R_OWNER
|
||||||
|
FROM DBA_CONSTRAINTS
|
||||||
|
WHERE CONSTRAINT_TYPE='R'
|
||||||
|
AND STATUS='ENABLED'
|
||||||
|
AND TABLE_NAME='$table' $owner
|
||||||
|
END
|
||||||
$sth->execute or die $sth->errstr;
|
$sth->execute or die $sth->errstr;
|
||||||
|
|
||||||
my @data = ();
|
my @data = ();
|
||||||
@ -1496,7 +1563,7 @@ sub _foreign_key
|
|||||||
next if (grep(/^$row->[0]$/, @tab_done));
|
next if (grep(/^$row->[0]$/, @tab_done));
|
||||||
push(@data, [ @$row ]);
|
push(@data, [ @$row ]);
|
||||||
push(@tab_done, $row->[0]);
|
push(@tab_done, $row->[0]);
|
||||||
my $sql = "SELECT DISTINCT COLUMN_NAME FROM DBA_CONS_COLUMNS WHERE CONSTRAINT_NAME='$row->[0]'";
|
my $sql = "SELECT DISTINCT COLUMN_NAME FROM DBA_CONS_COLUMNS WHERE CONSTRAINT_NAME='$row->[0]' $owner";
|
||||||
my $sth2 = $self->{dbh}->prepare($sql) or die $self->{dbh}->errstr;
|
my $sth2 = $self->{dbh}->prepare($sql) or die $self->{dbh}->errstr;
|
||||||
$sth2->execute or die $sth2->errstr;
|
$sth2->execute or die $sth2->errstr;
|
||||||
my @done = ();
|
my @done = ();
|
||||||
@ -1506,7 +1573,8 @@ sub _foreign_key
|
|||||||
push(@done, $r->[0]);
|
push(@done, $r->[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$sql = "SELECT DISTINCT TABLE_NAME,COLUMN_NAME FROM DBA_CONS_COLUMNS WHERE CONSTRAINT_NAME='$row->[1]'";
|
$owner = "AND OWNER = '$row->[6]'" if ($owner);
|
||||||
|
$sql = "SELECT DISTINCT TABLE_NAME,COLUMN_NAME FROM DBA_CONS_COLUMNS WHERE CONSTRAINT_NAME='$row->[1]' $owner";
|
||||||
$sth2 = $self->{dbh}->prepare($sql) or die $self->{dbh}->errstr;
|
$sth2 = $self->{dbh}->prepare($sql) or die $self->{dbh}->errstr;
|
||||||
$sth2->execute or die $sth2->errstr;
|
$sth2->execute or die $sth2->errstr;
|
||||||
@done = ();
|
@done = ();
|
||||||
@ -1515,6 +1583,7 @@ sub _foreign_key
|
|||||||
push(@{$link{$row->[0]}{remote}{$r->[0]}}, $r->[1]);
|
push(@{$link{$row->[0]}{remote}{$r->[0]}}, $r->[1]);
|
||||||
push(@done, $r->[1]);
|
push(@done, $r->[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1624,7 +1693,7 @@ sub _get_all_grants
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 _get_indexes TABLE
|
=head2 _get_indexes TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native indexes information.
|
This function implements a Oracle-native indexes information.
|
||||||
|
|
||||||
@ -1636,11 +1705,21 @@ given table.
|
|||||||
|
|
||||||
sub _get_indexes
|
sub _get_indexes
|
||||||
{
|
{
|
||||||
my($self, $table) = @_;
|
my ($self, $table, $owner) = @_;
|
||||||
|
|
||||||
|
my $sub_owner = '';
|
||||||
|
if ($owner) {
|
||||||
|
$owner = "AND dba_indexes.OWNER='$owner' AND dba_ind_columns.INDEX_OWNER=dba_indexes.OWNER";
|
||||||
|
$sub_owner = "AND OWNER=dba_indexes.TABLE_OWNER";
|
||||||
|
}
|
||||||
# Retrieve all indexes
|
# Retrieve all indexes
|
||||||
my $str = "SELECT DISTINCT DBA_IND_COLUMNS.INDEX_NAME, DBA_IND_COLUMNS.COLUMN_NAME, DBA_INDEXES.UNIQUENESS FROM DBA_IND_COLUMNS, DBA_INDEXES WHERE DBA_IND_COLUMNS.TABLE_NAME='$table' AND DBA_INDEXES.INDEX_NAME=DBA_IND_COLUMNS.INDEX_NAME AND DBA_IND_COLUMNS.INDEX_NAME NOT IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE TABLE_NAME='$table')";
|
my $sth = $self->{dbh}->prepare(<<END) or die $self->{dbh}->errstr;
|
||||||
my $sth = $self->{dbh}->prepare($str) or die $self->{dbh}->errstr;
|
SELECT DISTINCT dba_ind_columns.INDEX_NAME, dba_ind_columns.COLUMN_NAME, dba_indexes.UNIQUENESS
|
||||||
|
FROM dba_ind_columns, dba_indexes
|
||||||
|
WHERE dba_ind_columns.TABLE_NAME='$table' $owner
|
||||||
|
AND dba_indexes.INDEX_NAME=dba_ind_columns.INDEX_NAME
|
||||||
|
AND dba_ind_columns.INDEX_NAME NOT IN (SELECT CONSTRAINT_NAME FROM all_constraints WHERE TABLE_NAME='$table' $sub_owner)
|
||||||
|
END
|
||||||
$sth->execute or die $sth->errstr;
|
$sth->execute or die $sth->errstr;
|
||||||
|
|
||||||
my %data = ();
|
my %data = ();
|
||||||
@ -1852,7 +1931,7 @@ sub _get_packages
|
|||||||
print STDERR "\tFound Package: $row->[0]\n" if ($self->{debug});
|
print STDERR "\tFound Package: $row->[0]\n" if ($self->{debug});
|
||||||
next if (grep(/^$row->[0]$/, @fct_done));
|
next if (grep(/^$row->[0]$/, @fct_done));
|
||||||
push(@fct_done, $row->[0]);
|
push(@fct_done, $row->[0]);
|
||||||
my $sql = "SELECT TEXT FROM DBA_SOURCE WHERE OWNER='$row->[1]' AND NAME='$row->[0]' ORDER BY LINE";
|
my $sql = "SELECT TEXT FROM DBA_SOURCE WHERE OWNER='$row->[1]' AND NAME='$row->[0]' AND (TYPE='PACKAGE' OR TYPE='PACKAGE BODY') ORDER BY TYPE, LINE";
|
||||||
my $sth2 = $self->{dbh}->prepare($sql) or die $self->{dbh}->errstr;
|
my $sth2 = $self->{dbh}->prepare($sql) or die $self->{dbh}->errstr;
|
||||||
$sth2->execute or die $sth2->errstr;
|
$sth2->execute or die $sth2->errstr;
|
||||||
while (my $r = $sth2->fetch) {
|
while (my $r = $sth2->fetch) {
|
||||||
|
@ -76,6 +76,9 @@ SYNOPSIS
|
|||||||
If export failed and complain that the table doesn't exists use this to
|
If export failed and complain that the table doesn't exists use this to
|
||||||
prefix the table name by the schema name.
|
prefix the table name by the schema name.
|
||||||
|
|
||||||
|
If you want to use PostgreSQL 7.3 schema support activate the init
|
||||||
|
option 'export_schema' set to 1. Default is no schema export
|
||||||
|
|
||||||
To know at which indices tables can be found during extraction use the
|
To know at which indices tables can be found during extraction use the
|
||||||
option:
|
option:
|
||||||
|
|
||||||
@ -184,6 +187,7 @@ ABSTRACT
|
|||||||
with unique, primary and foreign key.
|
with unique, primary and foreign key.
|
||||||
- Grants/privileges export by user and group.
|
- Grants/privileges export by user and group.
|
||||||
- Table selection (by name and max table) export.
|
- Table selection (by name and max table) export.
|
||||||
|
- Export Oracle schema to PostgreSQL 7.3 schema.
|
||||||
- Predefined functions/triggers/procedures/packages export.
|
- Predefined functions/triggers/procedures/packages export.
|
||||||
- Data export.
|
- Data export.
|
||||||
- Sql query converter (todo)
|
- Sql query converter (todo)
|
||||||
@ -209,11 +213,12 @@ PUBLIC METHODS
|
|||||||
- type : Type of data to extract, can be TABLE,VIEW,GRANT,SEQUENCE,
|
- type : Type of data to extract, can be TABLE,VIEW,GRANT,SEQUENCE,
|
||||||
TRIGGER,FUNCTION,PROCEDURE,DATA,COPY,PACKAGE
|
TRIGGER,FUNCTION,PROCEDURE,DATA,COPY,PACKAGE
|
||||||
- debug : Print the current state of the parsing
|
- debug : Print the current state of the parsing
|
||||||
|
- export_schema : Export Oracle schema to PostgreSQL 7.3 schema
|
||||||
- tables : Extract only the given tables (arrayref)
|
- tables : Extract only the given tables (arrayref)
|
||||||
- showtableid : Display only the table indice during extraction
|
- showtableid : Display only the table indice during extraction
|
||||||
- min : Indice to begin extraction. Default to 0
|
- min : Indice to begin extraction. Default to 0
|
||||||
- max : Indice to end extraction. Default to 0 mean no limits
|
- max : Indice to end extraction. Default to 0 mean no limits
|
||||||
- data_limit : Number max of tuples to return during data extraction (default 10)
|
- data_limit : Number max of tuples to return during data extraction (default 0 no limit)
|
||||||
|
|
||||||
Attempt that this list should grow a little more because all
|
Attempt that this list should grow a little more because all
|
||||||
initialization is done by this way.
|
initialization is done by this way.
|
||||||
@ -306,10 +311,10 @@ PRIVATE METHODS
|
|||||||
It also call these other private subroutine to affect the main hash of
|
It also call these other private subroutine to affect the main hash of
|
||||||
the database structure :
|
the database structure :
|
||||||
|
|
||||||
@{$self->{tables}{$class_name}{column_info}} = $self->_column_info($class_name);
|
@{$self->{tables}{$class_name}{column_info}} = $self->_column_info($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{primary_key}} = $self->_primary_key($class_name);
|
@{$self->{tables}{$class_name}{primary_key}} = $self->_primary_key($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{unique_key}} = $self->_unique_key($class_name);
|
@{$self->{tables}{$class_name}{unique_key}} = $self->_unique_key($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{foreign_key}} = $self->_foreign_key($class_name);
|
@{$self->{tables}{$class_name}{foreign_key}} = $self->_foreign_key($class_name, $owner);
|
||||||
|
|
||||||
_views
|
_views
|
||||||
|
|
||||||
@ -340,7 +345,7 @@ PRIVATE METHODS
|
|||||||
This function return the PostgreSQL datatype corresponding to the Oracle
|
This function return the PostgreSQL datatype corresponding to the Oracle
|
||||||
internal type.
|
internal type.
|
||||||
|
|
||||||
_column_info TABLE
|
_column_info TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native column information.
|
This function implements a Oracle-native column information.
|
||||||
|
|
||||||
@ -350,21 +355,21 @@ PRIVATE METHODS
|
|||||||
[( column name, column type, column length, nullable column, default
|
[( column name, column type, column length, nullable column, default
|
||||||
value )]
|
value )]
|
||||||
|
|
||||||
_primary_key TABLE
|
_primary_key TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native primary key column information.
|
This function implements a Oracle-native primary key column information.
|
||||||
|
|
||||||
Return a list of all column name defined as primary key for the given
|
Return a list of all column name defined as primary key for the given
|
||||||
table.
|
table.
|
||||||
|
|
||||||
_unique_key TABLE
|
_unique_key TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native unique key column information.
|
This function implements a Oracle-native unique key column information.
|
||||||
|
|
||||||
Return a list of all column name defined as unique key for the given
|
Return a list of all column name defined as unique key for the given
|
||||||
table.
|
table.
|
||||||
|
|
||||||
_foreign_key TABLE
|
_foreign_key TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native foreign key reference
|
This function implements a Oracle-native foreign key reference
|
||||||
information.
|
information.
|
||||||
@ -404,7 +409,7 @@ PRIVATE METHODS
|
|||||||
|
|
||||||
Return a hash of all tables grants as an array of associated users.
|
Return a hash of all tables grants as an array of associated users.
|
||||||
|
|
||||||
_get_indexes TABLE
|
_get_indexes TABLE OWNER
|
||||||
|
|
||||||
This function implements a Oracle-native indexes information.
|
This function implements a Oracle-native indexes information.
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
The following need your contribution :
|
The following need your contribution :
|
||||||
|
|
||||||
- Fix problem regarding table/constraint output order.
|
|
||||||
- SQL queries converter.
|
- SQL queries converter.
|
||||||
- PL/SQL code converter.
|
- PL/SQL code converter.
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
<HTML>
|
<HTML>
|
||||||
<HEAD>
|
<HEAD>
|
||||||
<TITLE>Ora2Pg - Oracle to PostgreSQL database schema converter</TITLE>
|
<TITLE>Ora2Pg - Oracle to PostgreSQL database schema converter</TITLE>
|
||||||
<LINK REV="made" HREF="mailto:darold@localhost.localdomain">
|
|
||||||
</HEAD>
|
</HEAD>
|
||||||
|
|
||||||
<BODY>
|
<BODY>
|
||||||
@ -40,14 +39,14 @@
|
|||||||
<LI><A HREF="#_get_sql_data">_get_sql_data</A></LI>
|
<LI><A HREF="#_get_sql_data">_get_sql_data</A></LI>
|
||||||
<LI><A HREF="#_get_data table">_get_data TABLE</A></LI>
|
<LI><A HREF="#_get_data table">_get_data TABLE</A></LI>
|
||||||
<LI><A HREF="#_sql_type internal_type length precision scale">_sql_type INTERNAL_TYPE LENGTH PRECISION SCALE</A></LI>
|
<LI><A HREF="#_sql_type internal_type length precision scale">_sql_type INTERNAL_TYPE LENGTH PRECISION SCALE</A></LI>
|
||||||
<LI><A HREF="#_column_info table">_column_info TABLE</A></LI>
|
<LI><A HREF="#_column_info table owner">_column_info TABLE OWNER</A></LI>
|
||||||
<LI><A HREF="#_primary_key table">_primary_key TABLE</A></LI>
|
<LI><A HREF="#_primary_key table owner">_primary_key TABLE OWNER</A></LI>
|
||||||
<LI><A HREF="#_unique_key table">_unique_key TABLE</A></LI>
|
<LI><A HREF="#_unique_key table owner">_unique_key TABLE OWNER</A></LI>
|
||||||
<LI><A HREF="#_foreign_key table">_foreign_key TABLE</A></LI>
|
<LI><A HREF="#_foreign_key table owner">_foreign_key TABLE OWNER</A></LI>
|
||||||
<LI><A HREF="#_get_users">_get_users</A></LI>
|
<LI><A HREF="#_get_users">_get_users</A></LI>
|
||||||
<LI><A HREF="#_get_roles">_get_roles</A></LI>
|
<LI><A HREF="#_get_roles">_get_roles</A></LI>
|
||||||
<LI><A HREF="#_get_all_grants">_get_all_grants</A></LI>
|
<LI><A HREF="#_get_all_grants">_get_all_grants</A></LI>
|
||||||
<LI><A HREF="#_get_indexes table">_get_indexes TABLE</A></LI>
|
<LI><A HREF="#_get_indexes table owner">_get_indexes TABLE OWNER</A></LI>
|
||||||
<LI><A HREF="#_get_sequences">_get_sequences</A></LI>
|
<LI><A HREF="#_get_sequences">_get_sequences</A></LI>
|
||||||
<LI><A HREF="#_get_views">_get_views</A></LI>
|
<LI><A HREF="#_get_views">_get_views</A></LI>
|
||||||
<LI><A HREF="#_alias_info">_alias_info</A></LI>
|
<LI><A HREF="#_alias_info">_alias_info</A></LI>
|
||||||
@ -141,6 +140,8 @@ to your schema name:</P>
|
|||||||
<P>This schema definition can also be needed when you want to export data. If export
|
<P>This schema definition can also be needed when you want to export data. If export
|
||||||
failed and complain that the table doesn't exists use this to prefix the table name
|
failed and complain that the table doesn't exists use this to prefix the table name
|
||||||
by the schema name.</P>
|
by the schema name.</P>
|
||||||
|
<P>If you want to use PostgreSQL 7.3 schema support activate the init option
|
||||||
|
'export_schema' set to 1. Default is no schema export</P>
|
||||||
<P>To know at which indices tables can be found during extraction use the option:</P>
|
<P>To know at which indices tables can be found during extraction use the option:</P>
|
||||||
<PRE>
|
<PRE>
|
||||||
showtableid => 1</PRE>
|
showtableid => 1</PRE>
|
||||||
@ -224,6 +225,7 @@ the connection parameters to the Oracle database.</P>
|
|||||||
with unique, primary and foreign key.
|
with unique, primary and foreign key.
|
||||||
- Grants/privileges export by user and group.
|
- Grants/privileges export by user and group.
|
||||||
- Table selection (by name and max table) export.
|
- Table selection (by name and max table) export.
|
||||||
|
- Export Oracle schema to PostgreSQL 7.3 schema.
|
||||||
- Predefined functions/triggers/procedures/packages export.
|
- Predefined functions/triggers/procedures/packages export.
|
||||||
- Data export.
|
- Data export.
|
||||||
- Sql query converter (todo)</PRE>
|
- Sql query converter (todo)</PRE>
|
||||||
@ -248,11 +250,12 @@ so contribution is welcome.</P>
|
|||||||
- type : Type of data to extract, can be TABLE,VIEW,GRANT,SEQUENCE,
|
- type : Type of data to extract, can be TABLE,VIEW,GRANT,SEQUENCE,
|
||||||
TRIGGER,FUNCTION,PROCEDURE,DATA,COPY,PACKAGE
|
TRIGGER,FUNCTION,PROCEDURE,DATA,COPY,PACKAGE
|
||||||
- debug : Print the current state of the parsing
|
- debug : Print the current state of the parsing
|
||||||
|
- export_schema : Export Oracle schema to PostgreSQL 7.3 schema
|
||||||
- tables : Extract only the given tables (arrayref)
|
- tables : Extract only the given tables (arrayref)
|
||||||
- showtableid : Display only the table indice during extraction
|
- showtableid : Display only the table indice during extraction
|
||||||
- min : Indice to begin extraction. Default to 0
|
- min : Indice to begin extraction. Default to 0
|
||||||
- max : Indice to end extraction. Default to 0 mean no limits
|
- max : Indice to end extraction. Default to 0 mean no limits
|
||||||
- data_limit : Number max of tuples to return during data extraction (default 10)</PRE>
|
- data_limit : Number max of tuples to return during data extraction (default 0 no limit)</PRE>
|
||||||
<P>Attempt that this list should grow a little more because all initialization is
|
<P>Attempt that this list should grow a little more because all initialization is
|
||||||
done by this way.</P>
|
done by this way.</P>
|
||||||
<P>
|
<P>
|
||||||
@ -328,10 +331,10 @@ main hash of the database structure :</P>
|
|||||||
<P>It also call these other private subroutine to affect the main hash
|
<P>It also call these other private subroutine to affect the main hash
|
||||||
of the database structure :</P>
|
of the database structure :</P>
|
||||||
<PRE>
|
<PRE>
|
||||||
@{$self->{tables}{$class_name}{column_info}} = $self->_column_info($class_name);
|
@{$self->{tables}{$class_name}{column_info}} = $self->_column_info($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{primary_key}} = $self->_primary_key($class_name);
|
@{$self->{tables}{$class_name}{primary_key}} = $self->_primary_key($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{unique_key}} = $self->_unique_key($class_name);
|
@{$self->{tables}{$class_name}{unique_key}} = $self->_unique_key($class_name, $owner);
|
||||||
@{$self->{tables}{$class_name}{foreign_key}} = $self->_foreign_key($class_name);</PRE>
|
@{$self->{tables}{$class_name}{foreign_key}} = $self->_foreign_key($class_name, $owner);</PRE>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="_views">_views</A></H2>
|
<H2><A NAME="_views">_views</A></H2>
|
||||||
<P>This function is used to retrieve all views information.</P>
|
<P>This function is used to retrieve all views information.</P>
|
||||||
@ -354,7 +357,7 @@ database values are the text definition of the views.</P>
|
|||||||
<P>This function return the PostgreSQL datatype corresponding to the
|
<P>This function return the PostgreSQL datatype corresponding to the
|
||||||
Oracle internal type.</P>
|
Oracle internal type.</P>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="_column_info table">_column_info TABLE</A></H2>
|
<H2><A NAME="_column_info table owner">_column_info TABLE OWNER</A></H2>
|
||||||
<P>This function implements a Oracle-native column information.</P>
|
<P>This function implements a Oracle-native column information.</P>
|
||||||
<P>Return a list of array reference containing the following informations
|
<P>Return a list of array reference containing the following informations
|
||||||
for each column the given a table</P>
|
for each column the given a table</P>
|
||||||
@ -366,19 +369,19 @@ for each column the given a table</P>
|
|||||||
default value
|
default value
|
||||||
)]</P>
|
)]</P>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="_primary_key table">_primary_key TABLE</A></H2>
|
<H2><A NAME="_primary_key table owner">_primary_key TABLE OWNER</A></H2>
|
||||||
<P>This function implements a Oracle-native primary key column
|
<P>This function implements a Oracle-native primary key column
|
||||||
information.</P>
|
information.</P>
|
||||||
<P>Return a list of all column name defined as primary key
|
<P>Return a list of all column name defined as primary key
|
||||||
for the given table.</P>
|
for the given table.</P>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="_unique_key table">_unique_key TABLE</A></H2>
|
<H2><A NAME="_unique_key table owner">_unique_key TABLE OWNER</A></H2>
|
||||||
<P>This function implements a Oracle-native unique key column
|
<P>This function implements a Oracle-native unique key column
|
||||||
information.</P>
|
information.</P>
|
||||||
<P>Return a list of all column name defined as unique key
|
<P>Return a list of all column name defined as unique key
|
||||||
for the given table.</P>
|
for the given table.</P>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="_foreign_key table">_foreign_key TABLE</A></H2>
|
<H2><A NAME="_foreign_key table owner">_foreign_key TABLE OWNER</A></H2>
|
||||||
<P>This function implements a Oracle-native foreign key reference
|
<P>This function implements a Oracle-native foreign key reference
|
||||||
information.</P>
|
information.</P>
|
||||||
<P>Return a list of hash of hash of array reference. Ouuf! Nothing very difficult.
|
<P>Return a list of hash of hash of array reference. Ouuf! Nothing very difficult.
|
||||||
@ -409,7 +412,7 @@ information.</P>
|
|||||||
information.</P>
|
information.</P>
|
||||||
<P>Return a hash of all tables grants as an array of associated users.</P>
|
<P>Return a hash of all tables grants as an array of associated users.</P>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="_get_indexes table">_get_indexes TABLE</A></H2>
|
<H2><A NAME="_get_indexes table owner">_get_indexes TABLE OWNER</A></H2>
|
||||||
<P>This function implements a Oracle-native indexes information.</P>
|
<P>This function implements a Oracle-native indexes information.</P>
|
||||||
<P>Return hash of array containing all unique index and a hash of
|
<P>Return hash of array containing all unique index and a hash of
|
||||||
array of all indexes name which are not primary keys for the
|
array of all indexes name which are not primary keys for the
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# Project : Oracle2Postgresql
|
# Project : Oracle to Postgresql converter
|
||||||
# Name : ora2pg.pl
|
# Name : ora2pg.pl
|
||||||
# Language : 5.006 built for i686-linux
|
# Language : perl, v5.6.1
|
||||||
# OS : linux RedHat 6.2 kernel 2.2.14-5
|
# OS : linux RedHat 7.3 kernel 2.4.18-17.7.xsmp
|
||||||
# Author : Gilles Darold, gilles@darold.net
|
# Author : Gilles Darold, gilles@darold.net
|
||||||
# Copyright: Copyright (c) 2000 : Gilles Darold - All rights reserved -
|
# Copyright: Copyright (c) 2000-2002 : Gilles Darold - All rights reserved -
|
||||||
# Function : Script used to convert Oracle Database schema to PostgreSQL
|
# Function : Script used to convert Oracle Database to PostgreSQL
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# Version : 1.1
|
# Version : 2.0
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
@ -20,17 +20,18 @@ use strict;
|
|||||||
use Ora2Pg;
|
use Ora2Pg;
|
||||||
|
|
||||||
# Initialyze the database connection
|
# Initialyze the database connection
|
||||||
my $dbsrc = 'dbi:Oracle:host=test.mydomain.com;sid=TEST;port=1521';
|
my $dbsrc = 'dbi:Oracle:host=localhost;sid=TEST';
|
||||||
my $dbuser = 'system';
|
my $dbuser = 'system';
|
||||||
my $dbpwd = 'manager';
|
my $dbpwd = 'manager';
|
||||||
|
|
||||||
# Create an instance of the XSD::DBISchema perl module
|
# Create an instance of the Ora2Pg perl module
|
||||||
my $schema = new Ora2Pg (
|
my $schema = new Ora2Pg (
|
||||||
datasource => $dbsrc, # Database DBD datasource
|
datasource => $dbsrc, # Database DBD datasource
|
||||||
user => $dbuser, # Database user
|
user => $dbuser, # Database user
|
||||||
password => $dbpwd, # Database password
|
password => $dbpwd, # Database password
|
||||||
debug => 1, # Verbose mode
|
debug => 1, # Verbose mode
|
||||||
schema => 'ALICIA7', # Extract only APPS schema
|
# export_schema => 1, # Export Oracle schema to Postgresql 7.3 schema
|
||||||
|
# schema => 'APPS', # Extract only the given schema namespace
|
||||||
type => 'TABLE', # Extract table
|
type => 'TABLE', # Extract table
|
||||||
# type => 'PACKAGE', # Extract PACKAGE information
|
# type => 'PACKAGE', # Extract PACKAGE information
|
||||||
# type => 'DATA', # Extract data with output as INSERT statement
|
# type => 'DATA', # Extract data with output as INSERT statement
|
||||||
@ -41,17 +42,14 @@ my $schema = new Ora2Pg (
|
|||||||
# type => 'TRIGGER', # Extract triggers
|
# type => 'TRIGGER', # Extract triggers
|
||||||
# type => 'FUNCTION', # Extract functions
|
# type => 'FUNCTION', # Extract functions
|
||||||
# type => 'PROCEDURE', # Extract procedures
|
# type => 'PROCEDURE', # Extract procedures
|
||||||
# tables => [('FND_USER_PREFERENCES')], # unique index + users
|
|
||||||
# tables => [('CUSTOMER_DATA')], # Unique and primary key
|
|
||||||
# tables => [('TX_DATA')], # simple indexes
|
# tables => [('TX_DATA')], # simple indexes
|
||||||
# tables => [('NDW_BROWSER_ATTRIBUTES')], # view
|
# tables => [('NDW_BROWSER_ATTRIBUTES')], # view
|
||||||
# tables => [('TRIP_DATA')], # Foreign key
|
# tables => [('TRIP_DATA')], # Foreign key
|
||||||
# tables => [('JO_TMP')], # Foreign key
|
|
||||||
# showtableid => 1, # Display only table indice during extraction
|
# showtableid => 1, # Display only table indice during extraction
|
||||||
# min => 1, # Extract begin at indice 3
|
# min => 1, # Extract begin at indice 3
|
||||||
# max => 10, # Extract ended at indice 5
|
# max => 10, # Extract ended at indice 5
|
||||||
# data_limit => 1000, # Extract all data by dump of 1000 tuples
|
# data_limit => 1000, # Extract all data by dump of 1000 tuples
|
||||||
# data_limit => 0, # Extract all data in one pass. Be sure to have enougth memory
|
# data_limit => 0, # Extract all data in one pass. Be sure to have enougth memory.
|
||||||
);
|
);
|
||||||
|
|
||||||
# Just export data of the following fields from table 's_txcot'
|
# Just export data of the following fields from table 's_txcot'
|
||||||
@ -59,11 +57,10 @@ my $schema = new Ora2Pg (
|
|||||||
|
|
||||||
#### Function to use for extraction when type option is set to DATA or COPY
|
#### Function to use for extraction when type option is set to DATA or COPY
|
||||||
|
|
||||||
# Send exported data to a PostgreSQL database
|
# Send exported data directly to a PostgreSQL database
|
||||||
#$schema->send_to_pgdb('dbi:Pg:dbname=template1;host=localhost;port=5432','test','test');
|
#$schema->send_to_pgdb('dbi:Pg:dbname=test_db;host=localhost;port=5432','test','test');
|
||||||
|
|
||||||
# Output the data extracted from Oracle DB to a file or to STDOUT if no argument.
|
# Output the data extracted from Oracle DB to a file or to STDOUT if no argument.
|
||||||
# If you set the send_to_pgdb() method the output is given to PG database. See above
|
|
||||||
#$schema->export_data("output.sql");
|
#$schema->export_data("output.sql");
|
||||||
|
|
||||||
#### Function to use for extraction of other type
|
#### Function to use for extraction of other type
|
||||||
|
Loading…
x
Reference in New Issue
Block a user