#!/usr/local/bin/perl #============ EXTERNAL LIBRARIES use DBI; #============ EXPORTED ENVIRONMENT VARIABLES if (! (defined $ENV{"ORACLE_HOME"} and (defined $ENV{"ORACLE_SID"} or defined $ENV{"TWO_TASK"}))) { &Usage; exit ; } $ENV{"TWO_TASK"} = $ENV{"ORACLE_SID"} unless (defined $ENV{"TWO_TASK"}) ; $ENV{"ORACLE_SID"} = $ENV{"TWO_TASK"} unless (defined $ENV{"ORACLE_SID"}) ; if (defined($ENV{'LD_LIBRARY_PATH'})) { $LD_LIBRARY_PATH_DFLT = $ENV{'LD_LIBRARY_PATH'}; $LD_LIBRARY_PATH = "$ORACLE_HOME/lib:$LD_LIBRARY_PATH_DFLT:/usr/ucblib"; } else { $LD_LIBRARY_PATH_DFLT = ""; $LD_LIBRARY_PATH = "$ORACLE_HOME/lib:/usr/ucblib"; } $ORACLE_PATH = "$ORACLE_HOME/bin"; $ENV{"LD_LIBRARY_PATH"} = $LD_LIBRARY_PATH; $ENV{"PATH"} .= ":$ORACLE_PATH"; #==================== MAIN PROGRAM ====================# $|=1; $arg0 = $ARGV[0] ; $arg1 = $ARGV[1] ; $arg2 = $ARGV[2] ; if (length($arg0) == 0 || length($arg1) == 0) { &Usage ; } else { ($ORACLE_USER, $ORACLE_PASSWORD) = split(/\//, $arg0) ; if ($arg1 eq "-owners" or $arg1 eq "-tablown") { $columns = "OWNER" ; $columns .= ", TABLE_NAME" if ($arg1 eq "-tablown") ; $query = "select distinct $columns from all_catalog" ; $arg2 =~ tr/a-z/A-Z/; $query .= " where OWNER like '$arg2%'" if (length($arg2) != 0) ; &fetchquery_2stdout($query) ; } elsif ($arg1 eq "-tables" or $arg1 eq "-cols" or $arg1 eq "-types" or $arg1 eq "-proto" or $arg1 eq "-protown") { if (length($arg2) == 0) { $query = &mkquery_allcat_all ; } else { if ($arg1 eq "-protown") { $query = &mkquery_allcat_like_owner($arg2) ; } else { $query = &mkquery_allcat_like_table($arg2) ; } } if ($arg1 eq "-tables") { &fetchquery_2stdout($query) ; } elsif ($arg1 eq "-cols") { &print_tablecols($query) ; } elsif ($arg1 eq "-types") { &print_tablecols_type($query) ; } elsif ($arg1 eq "-proto" or $arg1 eq "-protown") { &print_tablecols_proto($query) ; } } else { &Usage; } } exit ; #==================== DIAGNOSTICS ====================# sub Usage { print STDOUT ("Usage\n") ; print STDOUT ("\t$0 user/password -tables [like]\n") ; print STDOUT ("\t$0 user/password -cols [like]\n") ; print STDOUT ("\t$0 user/password -types [like]\n") ; print STDOUT ("\t$0 user/password -proto [like]\n") ; print STDOUT ("\t$0 user/password -owners [like]\n") ; print STDOUT ("\t$0 user/password -tablown [like]\n") ; print STDOUT ("\t$0 user/password -protown [like]\n") ; print STDOUT ("where\n") ; print STDOUT ("\tuser/password : oracle user, password delimited by '/'\n"); print STDOUT ("\t-tables : list of tables in all_catalog\n"); print STDOUT ("\t-cols : list of tables with column names\n"); print STDOUT ("\t-types : list of tables with column names and types\n"); print STDOUT ("\t-proto : generate prototype table definition suitable for sql\n"); print STDOUT ("\t-owners : list of table owners in all_catalog\n"); print STDOUT ("\t-tablown : list of tables by owner in all_catalog\n"); print STDOUT ("\t-protown : generate prototypes, match owners in [like]\n"); print STDOUT ("\tlike : (optional) match lead chars of table or owner name(s)\n"); print STDOUT ("Environment Variables\n") ; print STDOUT ("\tORACLE_HOME - required\n"); print STDOUT ("\tORACLE_SID or TWO_TASK - required\n"); print STDOUT ("Examples\n") ; print STDOUT ("\t$0 tom/jerry -tables\n") ; print STDOUT ("\t$0 fred/barney -types ESADR\n") ; print STDOUT ("\t$0 \$LN -proto FOO > foo_tables.def\n") ; print STDOUT ("\t$0 \$LN -owners\n") ; return; } #============ sub dispdiags { &dispenv; return; } #============ sub dispenv { print STDOUT ("\n") ; print STDOUT ("Environment Variables\n") ; print STDOUT ("\n") ; my $key ; foreach $key (keys %ENV) { print STDOUT ("$key = $ENV{$key}\n") ; } return; } #==================== FUNCTIONS ====================# sub print_tablecols { my ($query) = @_ ; my @TableName = &fetchquery_2result($query) ; for (my $n=0; $n<@TableName; $n++) { my $tablename = $TableName[$n] ; my $query = &mkquery_alltabcol($tablename) ; my @ColumnName = &fetchquery_2result($query) ; print STDOUT ("$tablename :\n") ; for (my $m = 0; $m<@ColumnName; $m++) { print STDOUT ("\t$ColumnName[$m]\n") ; } } return ; } #============ sub print_tablecols_type { my ($query) = @_ ; my @TableName = &fetchquery_2result($query) ; for (my $n=0; $n<@TableName; $n++) { my $tablename = $TableName[$n] ; my $query = &mkquery_alltabcol_type($tablename) ; my @ColumnName = &fetchquery_2result($query) ; print STDOUT ("$tablename :\n") ; for (my $m = 0; $m<@ColumnName; $m++) { my ($colname, $coltype) = &columndefs($ColumnName[$m]) ; printf STDOUT ("\t%-32s%s\n", $colname, $coltype) ; } } return ; } #============ sub print_tablecols_proto { my ($query) = @_ ; my @TableName = &fetchquery_2result($query) ; for (my $n=0; $n<@TableName; $n++) { my $tablename = $TableName[$n] ; my $query = &mkquery_alltabcol_type($tablename) ; my @ColumnName = &fetchquery_2result($query) ; print STDOUT ("TABLE $tablename (\n") ; my $m ; my $colname ; my $coltype ; for ($m = 0; $m<(@ColumnName-1); $m++) { ($colname, $coltype) = &columndefs($ColumnName[$m]) ; printf STDOUT ("\t%-32s%s,\n", $colname, $coltype) ; } $m = (@ColumnName-1); ($colname, $coltype) = &columndefs($ColumnName[$m]) ; printf STDOUT ("\t%-32s%s\n", $colname, $coltype) ; printf STDOUT ("\t)\n") ; } return ; } #============ sub columndefs { my ($columndat) = @_ ; my ($colname, $coltype, $collen, $colprec, $colscale) = split(/\0/, $columndat) ; my $range ; if ($colprec ne "") { if ($colscale ne "" && $colscale != 0) { $range = "($colprec,$colscale)" ; } else { $range = "($colprec)" ; } } elsif ($coltype eq "CHAR" || $coltype eq "VARCHAR" || $coltype eq "VARCHAR2" || $coltype eq "RAW" ) { if ($collen ne "" && $collen != 0) { $range = "($collen)" ; } else { $range = "" ; } } else { $range = "" ; } $coltype .= $range ; return ($colname, $coltype) ; } #============ sub mkquery_alltabcol_type { my ($tablename) = @_ ; return "select COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE from all_tab_columns where all_tab_columns.TABLE_NAME = '$tablename'" ; } #============ sub mkquery_alltabcol { my ($tablename) = @_ ; return "select COLUMN_NAME from all_tab_columns where all_tab_columns.TABLE_NAME = '$tablename'" ; } #============ sub mkquery_allcat_all { return "select distinct TABLE_NAME from all_catalog" ; } #============ sub mkquery_allcat_like_table { my ($likestr) = @_ ; $likestr =~ tr/a-z/A-Z/; return "select distinct TABLE_NAME from all_catalog where all_catalog.TABLE_NAME like '$likestr%'" ; } #============ sub mkquery_allcat_like_owner { my ($likestr) = @_ ; $likestr =~ tr/a-z/A-Z/; return "select distinct TABLE_NAME from all_catalog where all_catalog.OWNER like '$likestr%'" ; } #============ sub mkquery_allcat_HEPW { return "select distinct TABLE_NAME from all_catalog where all_catalog.TABLE_NAME like 'HEPW%'" ; } #============ sub fetchquery_2stdout { my ($query) = @_ ; my $dbh = DBI->connect("dbi:Oracle:", $ORACLE_USER, $ORACLE_PASSWORD, { RaiseError=>1, AutoCommit=>0}) ; my $sth = $dbh->prepare($query) ; $sth->execute; while (my @row_ary = $sth->fetchrow_array) { print STDOUT ("$row_ary[$0]") ; for (my $t=1; $t<@row_ary; $t++) { print STDOUT ("\t$row_ary[$t]") ; } print STDOUT ("\n") ; } $sth->finish; $dbh->disconnect; return; } #============ sub fetchquery_2result { my ($query) = @_ ; my $dbh = DBI->connect("dbi:Oracle:", $ORACLE_USER, $ORACLE_PASSWORD, { RaiseError=>1, AutoCommit=>0}) ; my $sth = $dbh->prepare($query) ; $sth->execute; my $result ; @result = ""; my $count = 0; while (my @row_ary = $sth->fetchrow_array) { $result[$count] = $row_ary[$0]; for (my $k=1; $k<@row_ary; $k++) { $result[$count] .= "\0"; $result[$count] .= $row_ary[$k]; } $count++; } $sth->finish; $dbh->disconnect; if (length($result[0]) == 0) { return ; } else { return @result ; } } #============ sub print_result { my (@result) = @_ ; my $r ; for ($r = 0; $r<@result; $r++) { my @row_ary = split(/\0/, $result[$r]) ; print STDOUT ("$row_ary[$0]") ; for (my $q=1; $q<@row_ary; $q++) { print STDOUT ("\t$row_ary[$q]") ; } print STDOUT ("\n") ; } return; }