X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FProducer%2FOracle.pm;h=63e55ec84bcc9270cb684be1bd290800f37bb22f;hb=f92d79aad4f104af6eeb16d0e2660574b633fdf2;hp=3aeb6415f503c9d23b6e96da69e32fed7aa97a30;hpb=4dec2e49802d90fed1c7b1904468f167e7d5aaee;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Producer/Oracle.pm b/lib/SQL/Translator/Producer/Oracle.pm index 3aeb641..63e55ec 100644 --- a/lib/SQL/Translator/Producer/Oracle.pm +++ b/lib/SQL/Translator/Producer/Oracle.pm @@ -151,6 +151,20 @@ my %ora_reserved = map { $_, 1 } qw( WHENEVER WHERE WITH ); +# +# Oracle 8/9 max size of data types from: +# http://www.ss64.com/orasyntax/datatypes.html +# +my %max_size = ( + char => 2000, + nchar => 2000, + nvarchar2 => 4000, + number => [ 38, 127 ], + raw => 2000, + varchar => 4000, # only synonym for varchar2 + varchar2 => 4000, +); + my $max_id_length = 30; my %used_identifiers = (); my %global_names; @@ -202,7 +216,15 @@ sub produce { push @view_defs, create_view($view); } - return wantarray ? (defined $create ? $create : (), @table_defs, @view_defs, @fk_defs, @trigger_defs, @index_defs, @constraint_defs) : $create . join ('', map { $_ ? "$_;\n\n" : () } @table_defs, @view_defs, @fk_defs, @trigger_defs, @index_defs, @constraint_defs); + if (wantarray) { + return defined $create ? $create : (), @table_defs, @view_defs, @fk_defs, @trigger_defs, @index_defs, @constraint_defs; + } + else { + $create .= join ('', map { $_ ? "$_;\n\n" : () } @table_defs, @view_defs, @fk_defs, @index_defs, @constraint_defs); + # triggers may NOT end with a semicolon + $create .= join "\n\n", @trigger_defs; + return $create; + } } sub create_table { @@ -213,11 +235,11 @@ sub create_table { my $drop; my (@create, @field_defs, @constraint_defs, @fk_defs, @trigger_defs); - push @create, "--\n-- Table: $table_name\n--" unless $options->{no_comments}; - push @create, qq[DROP TABLE $table_name CASCADE CONSTRAINTS] if $options->{add_drop_table}; - my $table_name_ur = unreserve($table_name) or next; + push @create, "--\n-- Table: $table_name_ur\n--" unless $options->{no_comments}; + push @create, qq[DROP TABLE $table_name_ur CASCADE CONSTRAINTS] if $options->{add_drop_table}; + my ( %field_name_scope, @field_comments ); for my $field ( $table->get_fields ) { my ($field_create, $field_defs, $trigger_defs, $field_comments) = @@ -297,7 +319,7 @@ sub create_table { push @constraint_defs, "CONSTRAINT $name CHECK ($expression)"; } elsif ( $c->type eq FOREIGN_KEY ) { - $name = mk_name( join('_', $table_name, $c->fields). '_fk' ); + $name = mk_name( join('_', $table_name, $c->fields). '_fk' ); my $def = "CONSTRAINT $name FOREIGN KEY "; if ( @fields ) { @@ -321,12 +343,12 @@ sub create_table { $def .= ' ON DELETE '.join( ' ', $c->on_delete ); } - # disabled by plu 2007-12-29 - doesn't exist for oracle - #if ( $c->on_update ) { - # $def .= ' ON UPDATE '.join( ' ', $c->on_update ); - #} + # disabled by plu 2007-12-29 - doesn't exist for oracle + #if ( $c->on_update ) { + # $def .= ' ON UPDATE '.join( ' ', $c->on_update ); + #} - push @fk_defs, sprintf("ALTER TABLE %s ADD %s", $table, $def); + push @fk_defs, sprintf("ALTER TABLE %s ADD %s", $table_name_ur, $def); } } @@ -506,6 +528,17 @@ sub create_field { $data_type; $data_type ||= 'varchar2'; } + + # ensure size is not bigger than max size oracle allows for data type + if ( defined $max_size{$data_type} ) { + for ( my $i = 0 ; $i < scalar @size ; $i++ ) { + my $max = + ref( $max_size{$data_type} ) eq 'ARRAY' + ? $max_size{$data_type}->[$i] + : $max_size{$data_type}; + $size[$i] = $max if $size[$i] > $max; + } + } # # Fixes ORA-02329: column of datatype LOB cannot be @@ -609,7 +642,7 @@ sub create_field { " SELECT $seq_name.nextval\n" . " INTO :new." . $field->name."\n" . " FROM dual;\n" . - "END\n/"; + "END;\n/"; ; } @@ -622,7 +655,7 @@ sub create_field { "FOR EACH ROW WHEN (new.$field_name_ur IS NULL)\n". "BEGIN \n". " SELECT sysdate INTO :new.$field_name_ur FROM dual;\n". - "END\n/"; + "END;\n/"; } push @field_defs, $field_def;