X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=dump_oracle_table_for_pg;h=ebd7eb61f2f562b7a9a5f3a062559a8c21541331;hp=116c0054322b310f9eab4bc878bc8ce9d074142c;hb=3bb6926bbb549af97fe1ce2698b7fc15852607fa;hpb=07a1454d9162950c16e98347c13a64c3d8f60efb diff --git a/dump_oracle_table_for_pg b/dump_oracle_table_for_pg index 116c005..ebd7eb6 100755 --- a/dump_oracle_table_for_pg +++ b/dump_oracle_table_for_pg @@ -24,6 +24,8 @@ use warnings; use Carp; use DBI; use Getopt::Long; +use Encode; +use MARC::Charset qw/marc8_to_utf8/; my $host = 'localhost'; my $sid = $ENV{ORACLE_SID}; @@ -36,6 +38,7 @@ my $pg_table; my $base_table; my $column_prefix = ''; my $show_help; +my $src_charset; my $result = GetOptions( 'sid=s' => \$sid, @@ -48,6 +51,7 @@ my $result = GetOptions( 'pg-table=s' => \$pg_table, 'column-prefix=s' => \$column_prefix, 'inherits-from=s' => \$base_table, + 'source-charset=s' => \$src_charset, 'help' => \$show_help, ); @@ -94,7 +98,7 @@ sub export_table { my @data = map { normalize_value_for_tsv($_) } @$row; my $str = join("\t", @data); $str =~ s/\0//g; - print $fh "$str\n"; + print $fh encode('utf8', "$str\n"); } $sth->finish(); @@ -120,7 +124,15 @@ sub normalize_value_for_tsv { $val =~ s/\n/\\n/g; $val =~ s/\t/\\t/g; $val =~ s/\v/\\v/g; - return $val; + if ($src_charset) { + if ($src_charset eq 'marc8') { + return marc8_to_utf8($val); + } else { + return decode($src_charset, $val); + } + } else { + return $val; + } } else { return '\N'; } @@ -129,7 +141,7 @@ sub normalize_value_for_tsv { sub get_columns { my $table = shift; my $sth_cols = $dbh->prepare(' - SELECT column_name, data_type, data_precision, data_scale, nullable + SELECT column_name, data_type, data_precision, data_scale, data_length, nullable FROM user_tab_columns WHERE table_name = ? ORDER BY column_id '); $sth_cols->execute($table); @@ -147,11 +159,13 @@ sub get_pg_column_type { } elsif ($column_def->{DATA_TYPE} eq 'DATE') { $type = 'TIMESTAMP'; } elsif ($column_def->{DATA_TYPE} eq 'NUMBER') { - if ($column_def->{DATA_SCALE} == 0) { + if (!defined($column_def->{DATA_SCALE}) || $column_def->{DATA_SCALE} == 0) { $type = 'INTEGER'; } else { - $type = "NUMBER($column_def->{DATA_PRECISION},$column_def->{DATA_SCALE})"; + $type = "NUMERIC($column_def->{DATA_PRECISION},$column_def->{DATA_SCALE})"; } + } elsif ($column_def->{DATA_TYPE} eq 'CHAR') { + $type = "CHAR($column_def->{DATA_LENGTH})"; } if (defined $type) { $type .= " NOT NULL" if $column_def->{NULLABLE} eq 'N';