oracletool.pl
上传用户:abclishi
上传日期:2007-01-07
资源大小:99k
文件大小:435k
源码类别:

Oracle数据库

开发平台:

Perl

  1. #!/usr/bin/perl
  2. #   Copyright (c) 1998,1999,2000 Adam vonNieda
  3. #
  4. #   You may distribute under the terms of either the GNU General Public
  5. #   License or the Artistic License, as specified in the Perl README file,
  6. #   with the exception that it cannot be placed on a CD-ROM or similar media
  7. #   for commercial distribution without the prior approval of the author.
  8. #   This software is provided without warranty of any kind. If your server
  9. #   melts as a result of using this script, that's a bummer. But it won't.
  10. require 5.003;
  11. use strict;
  12. use CGI qw(:standard);
  13. use File::Basename;
  14. use FileHandle;
  15. if (! eval "require DBI") {
  16.    ErrorPage("It appears that the DBI module is not installed!");
  17. }
  18. my ($VERSION,$scriptname,$query,$database,$namesdatabase,$schema,$textarea_w);
  19. my ($debug,$object_type,$object_name,$statement_id,$user,$whereclause,$textarea_h);
  20. my ($expire,$username,$password,$dbh,$sql,$majversion,$minversion,$rowdisplay);
  21. my ($oracle7,$oracle8,$oracle8i,$db_block_size,$title,$heading,$cursor,$banner);
  22. my ($logging,$explainschema,$bgcolor,$headingcolor,$fontcolor,$infocolor,$font,$fontsize);
  23. my ($linkcolor,$cellcolor,$bordercolor,$description,%themes,$schema_cols,$menufontsize);
  24. my ($expiration,$oraclenames,$theme,$repository,$logfile,%plugins,$config_file);
  25. my ($encryption_string,$bgimage,$menuimage,$encryption_enabled,$copyright,$headingfont);
  26. my ($headingfontcolor);
  27. $VERSION = "1.2.0";
  28. # Edit the following if you want to use a config file not named "oracletool.ini".
  29. $config_file = "oracletool.ini";
  30. Main();
  31. #=============================================================
  32. # Nothing but subroutines from here on.
  33. #=============================================================
  34. sub Main {
  35.    my ($dbstatus);
  36. # Unbuffer STDOUT
  37.    $|++;
  38. # Find out the name this script was invoked as.
  39.    $scriptname = $ENV{'SCRIPT_NAME'};
  40. # Get the data from the elements passed in the URL.
  41.    $query = new CGI;
  42.    $database = $query->param('database');
  43.    $namesdatabase = $query->param('namesdatabase');
  44.    $schema = $query->param('schema');
  45.    $explainschema = $query->param('explainschema');
  46.    $object_type = $query->param('object_type');
  47.    $object_name         = $query->param('arg');
  48.    $statement_id = $query->param('statement_id');
  49.    $user = $query->param('user');
  50.    $whereclause = $query->param('whereclause');
  51.    $expire = $query->param('expire');
  52.    $password = $query->param('password');
  53. # Set the page colors / font etc.
  54. # Attempt to get a cookie containing the users theme.
  55. # Set to a default theme if none is found.
  56.    $theme = cookie("OracletoolTheme");
  57.    $theme = "Default1" unless ($theme);
  58. # Get the settings from the config file.
  59.    parseConfig();
  60. # Decide whether to display copyright in all SQL statements.
  61.    if ($ENV{'DISPLAY_COPYRIGHT'}) {
  62.       $copyright = "/* Oracletool v$VERSION is copyright 1998,1999,2000 Adam vonNieda, Kansas USA */ ";
  63.    } else {
  64.       $copyright = "";
  65.    }
  66.    logit("Enter subroutine Main");
  67. # Check for cookie encryption functionality.
  68.    encryptionEnabled();
  69. # Set the properties that will override the default theme.
  70.    doProperties();
  71. # If $namesdatabase is not null, then they have entered
  72. # a names-resolved database. Change the $database value
  73. # to the $namesdatabase value.
  74.    $database = $namesdatabase if $namesdatabase;
  75. # If $database is "About_oracletool" then
  76. # show the "About" page.
  77.    if ( $database && $database  eq "About_oracletool" ) {
  78.       about();
  79.    }
  80. # The $user variable will get passed to get session info
  81. # for an individual user. If no individual user is passed
  82. # then it defaults to % (All users)
  83.    $user  = "%" unless $user;
  84. # Get rid of the +'s on multi-word object types.
  85.    $object_type =~ s/+/ / if $object_type;
  86. # If invoked standalone, show main page with database list.
  87.    if ( ! defined $database ) {
  88.       createMainPage();
  89.       exit;
  90.    }
  91. # Skip the password verification for setting theme. Theme
  92. # will be sent to browser as cookie.
  93.    if ($object_type eq "SETTHEME") {
  94.       setTheme();
  95.    }
  96. # Skip the password verification for setting Properties. Properties
  97. # will be sent to browser as cookie.
  98.    if ($object_type eq "SETPROPS") {
  99.       setProperties();
  100.    }
  101. # Skip the password verification for explain plan. Password
  102. # will be entered on the explain plan screen.
  103.    if ($object_type eq "EXPLAIN") {
  104.       enterExplainPlan();
  105.    }
  106. # Skip the password verification for running explain plan. 
  107. # Password will be passed (hidden, and no cookie).
  108.    if ($object_type eq "RUNEXPLAINPLAN") {
  109.       runExplainPlan();
  110.    }
  111. # Add a password if no cookie is found, or if incorrect. 
  112.    if ($object_type eq "ADDPASSWORD")     {
  113.       $username = $query->param('username');
  114.       $password = $query->param('password');
  115.       addPasswd($database,$username,$password);
  116.    }
  117. # Attempt to get username and password cookies for connecting to the specified database. 
  118.    ($username,$password) = split / /, GetPasswd($database);
  119. # If no cookie is found, do not try to connect to the database,
  120. # just go directly to the password screen.
  121.    unless ($username && $password) {
  122.       EnterPasswd($database);
  123.    }
  124. # Make connection to the database
  125.    $dbh = dbConnect($database,$username,$password);
  126. # If invoked the first time after selecting the database,
  127. # start creating the frames.
  128.    if ( $object_type eq "FRAMEPAGE" ) {
  129.       framePage();
  130.    }
  131. # Find out if we are dealing with Oracle7 or Oracle8
  132.    logit("   Getting oracle version");
  133.    $sql = "$copyright
  134. SELECT MAX(SUBSTR(RELEASE,1,1)),
  135.        MAX(SUBSTR(RELEASE,3,1))
  136.    FROM SYS.V_$COMPATIBILITY
  137. ";
  138.    $cursor = $dbh->prepare($sql);
  139.    $cursor->execute;
  140.    (($majversion,$minversion) = $cursor->fetchrow_array);
  141.    $cursor->finish;
  142.    if ( $majversion eq "7" ) {
  143.       logit("   This is an Oracle7 database.");
  144.       $oracle7 = "Yep";
  145.     } else {
  146.       $oracle8 = "Yep";
  147.       logit("   This is an Oracle8 database.");
  148.       if ($minversion eq "1") {
  149.          logit("   This is an Oracle8i database.");
  150.          $oracle8i = "Yep";
  151.       }
  152.    }
  153. # See what status the database is in (OPEN,MOUNTED etc...). 
  154.    $dbstatus = dbStatus();
  155. # Display the menu on the left side of the screen.
  156. # This connects to the database as well, hence the
  157. # $username variable. Connection is for determining 
  158. # version, OPS etc. Certain buttons will or will not
  159. # be display based on some queries.
  160.    if ( $object_type eq "MENU" ) {
  161.       showMenu($username);
  162.    }
  163. # Find out the database block size
  164.    $db_block_size = getDBblocksize();
  165. # Get the Server banner to display the version info.
  166.    $banner = getBanner();
  167. # Create the header for the HTML page.
  168.  
  169.    $title      = "$database: Oracletool v$VERSION connected as $username";
  170.    $heading    = "";
  171.    Header($title,$heading,$font,$fontsize,$fontcolor,$bgcolor);
  172. # The Director subroutine will direct the script to the appropriate
  173. # subroutines based on the parameters passed, namely $object_type
  174.    Director();
  175. # Disconnect from the database
  176.    $dbh->disconnect;
  177. # Finish the HTML page.
  178.    Footer();
  179.    logit("Exit subroutine Main");
  180. }
  181. sub dbClosed {
  182.    logit("Enter subroutine dbClosed");
  183.    
  184.    Header($title,$heading,$font,$fontsize,$fontcolor,$bgcolor);
  185.    if ($object_name) {
  186.       logit("   SQL passed to dbClosed: n$object_name");
  187.       runSQL($object_name);
  188.    } else {
  189.       logit("   No SQL passed, displaying worksheet.");
  190.       enterWorksheet();
  191.    }
  192.    logit("Exit subroutine dbClosed");
  193.    exit;
  194. }
  195. sub dbStatus {
  196. # See what status the database is in.
  197.    my ($cursor,$sql,$dbstatus);
  198.    logit("Enter subroutine dbStatus");
  199.    if ($oracle8) {
  200.       logit("   We are Oracle8, checking database status.");
  201.       $sql = "$copyright
  202. SELECT
  203.    STATUS
  204. FROM V$INSTANCE
  205. ";
  206.       $cursor = $dbh->prepare($sql) or ErrorPage("Error: $DBI::errstr");
  207.       $cursor->execute;
  208.       $dbstatus = $cursor->fetchrow_array;
  209.       $cursor->finish;
  210.    } else {
  211.       logit("   We are Oracle7, assuming database is open.");
  212.       $dbstatus = "OPEN";
  213.    }
  214.    logit("   Database was found to be $dbstatus.");
  215.    if ($dbstatus ne "OPEN") {
  216.       dbClosed();
  217.    }
  218.    logit("Exit subroutine dbStatus");
  219.    return($dbstatus);
  220. }
  221. sub statsPackInstalled {
  222.    logit("Enter subroutine statsPackInstalled");
  223.    my ($sql,$count);
  224.    $sql = "
  225. SELECT
  226.    COUNT(*) 
  227. FROM DBA_OBJECTS
  228.    WHERE OBJECT_NAME = 'STATSPACK'
  229. AND OBJECT_TYPE = 'PACKAGE'
  230. ";
  231.    $count = recordCount($sql);
  232.    logit("Exit subroutine statsPackInstalled");
  233.    return($count);
  234. }
  235. sub loginfo {
  236.    my $text = shift;
  237.    if ($logging) {
  238.       open (LOG,">>$logfile") or ErrorPage("Oracletool error! Cannot open log file "$logfile"! You need to disable logging or choose a filename that you have permission to write to.");
  239.       print LOG "$textn";
  240.       close (LOG);
  241.    }
  242. }
  243. sub logit {
  244.    my $text = shift;
  245.    if ($debug) {
  246.       open (LOG,">>$logfile") or ErrorPage("Oracletool error! Cannot open log file "$logfile"! You need to disable logging or choose a filename that you have permission to write to.");
  247.       print LOG "$textn";
  248.       close (LOG);
  249.    }
  250. }
  251. sub parseConfig {
  252.    my ($parameter,$eq,$val,$plugin);
  253.    my $mytheme = $theme;
  254.    my ($description,@themevars,$key,$themevarcount);
  255.    open(CONFIG,"$config_file")
  256.       or ErrorPage("Can't open config file $config_file. Reason: $!.");
  257.    while (<CONFIG>) {
  258.       next if ((/^$/) || (/^s+$/) || (/^s+#/) || (/^#/));
  259.       chop;
  260.       ($parameter,$val) = split(/=/);
  261.       $parameter =~ s/^s+//;
  262.       $parameter =~ s/s+$//;
  263.       $val =~ s/^s+//;
  264.       $val =~ s/s+$//;
  265.       $parameter = uc($parameter);
  266.       if ($parameter eq "EXPIRATION") {
  267.          $expiration = "$val";
  268.          next;
  269.       }
  270.       if ($parameter eq "ORACLENAMES") {
  271.          $oraclenames = "Yep";
  272.          next;
  273.       }
  274.       if ($parameter eq "DEBUG") {
  275.          $debug = "Yep";
  276.          next;
  277.       }
  278.       if ($parameter eq "LOGGING") {
  279.          $logging = "Yep";
  280.          next;
  281.       }
  282.       if ($parameter eq "LOG") {
  283.          $logfile = "$val";
  284.          next;
  285.       }
  286.       if ($parameter eq "ENCRYPTION_STRING") {
  287.          $encryption_string = "$val";
  288.          next;
  289.       }
  290.    # Add plugins
  291.       if ($parameter eq "PLUGIN") {
  292.          $plugin = $val;
  293.          next;
  294.       }
  295.       if ($parameter eq "PROGRAM") {
  296.          $plugins{$plugin} = $val; 
  297.          next;
  298.       }
  299.    # Add themes..
  300.       if ($parameter eq "THEME") {
  301.          $theme = "$val";
  302.          $themevarcount++;
  303.          next;
  304.       }
  305.       if ($parameter eq "DESCRIPTION") {
  306.          $description = "$val";
  307.          $themevarcount++;
  308.          next;
  309.       }
  310.       if ($parameter eq "BGCOLOR") {
  311.          $bgcolor = "$val";
  312.          $themevarcount++;
  313.          next;
  314.       }
  315.       if ($parameter eq "MENUIMAGE") {
  316.          $menuimage = "$val";
  317.          $themevarcount++;
  318.          next;
  319.       }
  320.       if ($parameter eq "BGIMAGE") {
  321.          $bgimage = "$val";
  322.          $themevarcount++;
  323.          next;
  324.       }
  325.       if ($parameter eq "FONTCOLOR") {
  326.          $fontcolor = "$val";
  327.          $themevarcount++;
  328.          next;
  329.       }
  330.       if ($parameter eq "HEADINGFONTCOLOR") {
  331.          $headingfontcolor = "$val";
  332.          $themevarcount++;
  333.          next;
  334.       }
  335.       if ($parameter eq "INFOCOLOR") {
  336.          $infocolor = "$val";
  337.          $themevarcount++;
  338.          next;
  339.       }
  340.       if ($parameter eq "LINKCOLOR") {
  341.          $linkcolor = "$val";
  342.          $themevarcount++;
  343.          next;
  344.       }
  345.       if ($parameter eq "FONT") {
  346.          $font = "$val";
  347.          $themevarcount++;
  348.          next;
  349.       }
  350.       if ($parameter eq "HEADINGFONT") {
  351.          $headingfont = "$val";
  352.          $themevarcount++;
  353.          next;
  354.       }
  355.       if ($parameter eq "FONTSIZE") {
  356.          $fontsize = "$val";
  357.          $themevarcount++;
  358.          next;
  359.       }
  360.       if ($parameter eq "HEADINGCOLOR") {
  361.          $headingcolor = "$val";
  362.          $themevarcount++;
  363.          next;
  364.       }
  365.       if ($parameter eq "CELLCOLOR") {
  366.          $cellcolor = "$val";
  367.          $themevarcount++;
  368.          next;
  369.       }
  370.       if ($parameter eq "BORDERCOLOR") {
  371.          $bordercolor = "$val";
  372.          $themevarcount++;
  373.          next unless ($themevarcount == 15);
  374.       }
  375.       if (($themevarcount) && ($themevarcount == 15)) {
  376.          push @{ $themes{$theme} }, $description;
  377.          push @{ $themes{$theme} }, $bgcolor;
  378.          push @{ $themes{$theme} }, $menuimage;
  379.          push @{ $themes{$theme} }, $bgimage;
  380.          push @{ $themes{$theme} }, $fontcolor;
  381.          push @{ $themes{$theme} }, $headingfontcolor;
  382.          push @{ $themes{$theme} }, $infocolor;
  383.          push @{ $themes{$theme} }, $linkcolor;
  384.          push @{ $themes{$theme} }, $font;
  385.          push @{ $themes{$theme} }, $headingfont;
  386.          push @{ $themes{$theme} }, $fontsize;
  387.          push @{ $themes{$theme} }, $headingcolor;
  388.          push @{ $themes{$theme} }, $cellcolor;
  389.          push @{ $themes{$theme} }, $bordercolor;
  390.          undef $themevarcount;
  391.          next;
  392.       }
  393.    # If a parameter does not match a "hard coded" parameter
  394.    # above, assume it is an environmental variable.
  395.       $ENV{$parameter} = $val;
  396.    }
  397.    close(CONFIG);
  398.    if ((($debug) || ($logging)) && (! $logfile)) {
  399.       undef $debug;
  400.       undef $logging;
  401.    }
  402.    logit("Done reading config file.");
  403. # Check to be sure that a theme exists, in case it came
  404. # from a cookie. If someone creates a personal theme and
  405. # then installs a new version of the tool, their theme
  406. # may not exist anymore, but it will still be in the
  407. # OracletoolTheme cookie. Default, in this case.
  408.    logit("MyTheme is set to $mytheme");
  409.    foreach $key(keys %themes) {
  410.       if ($mytheme eq $key) {
  411.          $theme = $mytheme;
  412.          last;
  413.       } else {
  414.          $theme = "Default1";
  415.       }
  416.    }
  417.    logit("Theme is set to $theme");
  418.    foreach $key(keys %plugins) {
  419.       logit("Plugin $key: Program $plugins{$key}");
  420.    }
  421. # Now set the variables for the selected theme.
  422.    @themevars           = @{ $themes{$theme} };
  423.    $description         = $themevars[0];
  424.    $bgcolor             = $themevars[1];
  425.    $menuimage           = $themevars[2];
  426.    $bgimage             = $themevars[3];
  427.    $fontcolor           = $themevars[4];
  428.    $headingfontcolor    = $themevars[5];
  429.    $infocolor           = $themevars[6];
  430.    $linkcolor           = $themevars[7];
  431.    $font                = $themevars[8];
  432.    $headingfont         = $themevars[9];
  433.    $fontsize            = $themevars[10];
  434.    $headingcolor        = $themevars[11];
  435.    $cellcolor           = $themevars[12];
  436.    $bordercolor         = $themevars[13];
  437. # Print environment to debug if enabled.
  438. #   logit("Summary of ENV settings");
  439. #   foreach $key(keys %ENV) {
  440. #      logit("VAR: $key SETTING: $ENV{$key}");
  441. #   }
  442. }
  443. sub createMainPage() {
  444.    logit("Enter subroutine createMainPage");
  445. # This sub will be called if this script is invoked without a 'database=....'
  446. # element in the URL.  
  447. # Get the connection strings from the tnsnames.ora file.
  448.    my @sids = GetTNS();
  449. # Start creating main page
  450.    my $bgline = "<BODY BGCOLOR=$bgcolor>n";
  451.    if ($bgimage) {
  452.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$bgimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$bgimage")) {
  453.          logit("Background image is $ENV{'DOCUMENT_ROOT'}/$bgimage and is readable");
  454.          $bgline = "<BODY BACKGROUND=$bgimage>n";
  455.       }
  456.    }
  457. print << "EOF";
  458. Content-type: Text/htmlnn
  459. <HTML>
  460.   <HEAD>
  461.     <TITLE>Oracletool v$VERSION</TITLE>
  462.   </HEAD>
  463.     $bgline
  464.     <CENTER>
  465.     <H2> 
  466.     <FONT COLOR="$fontcolor" FACE="$font" SIZE="5">
  467.       Oracletool v$VERSION
  468.     </FONT>
  469.     </H2>
  470.     </CENTER>
  471.     <BR><BR>
  472.     <TABLE BGCOLOR="BLACK" WIDTH="400" CELLPADDING="1" CELLSPACING="0" BORDER="0">
  473.       <TR>
  474.         <TD VALIGN="TOP">
  475.           <TABLE BGCOLOR="$headingcolor" WIDTH="100%" CELLPADDING="2" CELLSPACING="1" BORDER="0">
  476.             <TR ALIGN="LEFT">
  477.               <TD>
  478.                 <TABLE>
  479.                   <TR>
  480.                     <TD ALIGN="LEFT">
  481.                       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  482. EOF
  483. print "                      <STRONG>Select an instance.</STRONG>n" if (! $oraclenames);
  484. print "                      <STRONG>Select or enter an instance name.</STRONG>n" if ($oraclenames);
  485. print <<"EOF";
  486.                       <FORM METHOD="POST" ACTION="$scriptname">
  487.                       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  488.                       <P>
  489.                       <SELECT NAME="database">
  490. EOF
  491. my $sid;
  492. foreach $sid (@sids) {
  493.    print "                <OPTION VALUE="$sid">$sid</OPTION>n";
  494. }
  495. print <<"EOF";
  496.                       </SELECT>
  497.                     </TD>
  498. EOF
  499.    if ($oraclenames) {
  500.       print <<"EOF";
  501.                   </TR>
  502.                   <TR>
  503.                     <TD>
  504.                       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  505.                       <INPUT TYPE="TEXT" NAME="namesdatabase" SIZE="20">
  506.                     </TD>
  507. EOF
  508.    }
  509.    print <<"EOF";
  510.                   </TR>
  511.                   <TR>
  512.                     <TD ALIGN="LEFT" VALIGN="TOP">
  513.                       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  514.                       <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="FRAMEPAGE">
  515.                       <INPUT TYPE="SUBMIT" VALUE="Connect">
  516.                       <INPUT TYPE="CHECKBOX" NAME="expire" VALUE="Yep">Expire password cookie
  517.                       </P>
  518.       </FORM>
  519.                       <P>
  520.                     </TD>
  521.                   </TR>
  522.                 </TABLE>
  523.               </TD>
  524.             </TR>
  525.           </TABLE>
  526.         </TD>
  527.       </TR>
  528.     </TABLE>
  529.   </BODY>
  530. </HTML>
  531. EOF
  532.    logit("Exit subroutine createMainPage");
  533. }
  534. sub dbConnect {
  535.    logit("Enter subroutine dbConnect");
  536.    my $database = shift;
  537.    my $username = shift;
  538.    my $password = shift;
  539.    loginfo("   Log - Host: $ENV{'REMOTE_HOST'} IP: $ENV{'REMOTE_ADDR'} DB: $database Command: $object_type Theme: $theme") if $logging;
  540. # Attempt to make connection to the database..
  541.    my $data_source = "dbi:Oracle:$database";
  542.    logit("   Datasource: $data_source");
  543.    logit("   ORACLE_HOME $ENV{'ORACLE_HOME'}");
  544.    logit("   TNS_ADMIN $ENV{'TNS_ADMIN'}");
  545.    logit("   Connecting...");
  546.    my $dbh = DBI->connect($data_source,$username,$password,{PrintError=>0});
  547. # If it fails, act on a couple of different Oracle errors.
  548. # Bring up the password screen for either of these errors.
  549. # ORA-01017 - "Invalid username/password; logon denied." 
  550. # ORA-01004 - "Default username feature not supported; logon denied."
  551. # ORA-01005 - "null password given; logon denied."
  552. # Show an error message for these errors.
  553. # ORA-12224 - "The connection request could not be completed because the listener is not running."
  554. # ORA-01034 - "Oracle was not started up."
  555. # ORA-01090 - "Shutdown in progress - connection is not permitted""
  556. # ORA-12154 - "The service name specified is not defined correctly in the TNSNAMES.ORA file."
  557. # ORA-12505 - "TNS:listener could not resolve SID given in connect descriptor."
  558. # ORA-12545 - "TNS:name lookup failure."
  559.    unless ($dbh) {
  560.       logit("   Failed login with username "$username". $ENV{'REMOTE_HOST'} IP: $ENV{'REMOTE_ADDR'}");
  561.       loginfo("   Failed login with username "$username". $ENV{'REMOTE_HOST'} IP: $ENV{'REMOTE_ADDR'}");
  562.       if ( $DBI::errstr =~ /ORA-01017|ORA-01004|ORA-01005/ ) {
  563.          EnterPasswd($database);
  564.          exit;
  565.       }
  566.       if ( $DBI::errstr =~ /ORA-12224/ ) {
  567.          ErrorPage ("You received an ORA-12224, which usually means the listener is down, or your connection definition in your tnsnames.ora file is incorrect. Check both of these things and try again.");
  568.          exit;
  569.       }
  570.       if ( $DBI::errstr =~ /ORA-01034/ ) {
  571.          ErrorPage ("You received an ORA-01034, which usually means the database is down. Check to be sure the database is up and try again.");
  572.          exit;
  573.       }
  574.       if ( $DBI::errstr =~ /ORA-01090/ ) {
  575.          ErrorPage ("You received an ORA-01090, which means the database is in the process of coming down.");
  576.          exit;
  577.       }
  578.       if ( $DBI::errstr =~ /ORA-12154/ ) {
  579.          ErrorPage ("You received an ORA-12154, which probably means you have a mistake in your TNSNAMES.ORA file for the database that you chose.");
  580.          exit;
  581.       }
  582.       if ( $DBI::errstr =~ /ORA-12505/ ) {
  583.          ErrorPage ("You received an ORA-12505, which probably means you have a mistake in your TNSNAMES.ORA file for the database that you chose, or the database you are trying to connect to is not defined to the listener that is running on that node.");
  584.          exit;
  585.       }
  586.       if ( $DBI::errstr =~ /ORA-12545/ ) {
  587.          ErrorPage ("You received an ORA-12545, which probably means you have a mistake in your TNSNAMES.ORA file for the database that you chose. (Possibly the node name).");
  588.          exit;
  589.       }
  590.       ErrorPage ("Unable to connect to Oracle ($DBI::errstr)n");
  591.       exit;
  592.    }
  593.    logit("   Got successful connection");
  594.    logit("Exit subroutine dbConnect");
  595.    return ($dbh);
  596. }
  597. sub setTheme {
  598.    logit("Enter subroutine setTheme");
  599.    my ($message,$duration,$url,$cookie,$path,$bgline);
  600.    $theme = $object_name;
  601.    $path   = dirname($scriptname);
  602.    $cookie = cookie(-name=>"OracletoolTheme",-value=>"$theme",-expires=>"+10y",-path=>"$path");
  603.    print header(-cookie=>[$cookie]);
  604.    $message     = "Your personal theme has been set to $theme.<BR>Oracletool will restart with a connection to instance $database.";
  605.    $duration    = "4";
  606.    $url         = "$scriptname?database=$database&object_type=FRAMEPAGE";
  607.    $bgline = "<BODY BGCOLOR=$bgcolor>n";
  608.    if ($bgimage) {
  609.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$bgimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$bgimage")) {
  610.          logit("   Background image is $ENV{'DOCUMENT_ROOT'}/$bgimage and is readable");
  611.          $bgline = "<BODY BACKGROUND=$bgimage>n";
  612.       }
  613.    }
  614.    print <<"EOF";
  615. <HTML>
  616.   <HEAD>
  617.     <TITLE>Theme is set to $theme.</TITLE>
  618.     <META HTTP-EQUIV="Refresh" Content="$duration;URL=$url">
  619.   </HEAD>
  620.    $bgline
  621.     <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  622.     <CENTER>
  623.       $message
  624.     </CENTER
  625.   </BODY
  626. </HTML>
  627. EOF
  628.    logit("Exit subroutine setTheme");
  629.    exit;
  630. }
  631. sub doProperties {
  632.    logit("Enter subroutine doProperties");
  633.    my $properties = cookie("OracletoolProps");
  634.    if ($properties) {
  635.       ($schema_cols,$fontsize,$menufontsize,$textarea_w,$textarea_h,$rowdisplay) = split (/%/, $properties);
  636.    } else {
  637.    # Set the variables that are not taken care of by a theme.
  638.       $menufontsize = "2";
  639.       $schema_cols = "5";
  640.       $textarea_w = "40";
  641.       $textarea_h = "20";
  642.       $rowdisplay = "25";
  643.    }
  644.    logit("Exit subroutine doProperties");
  645. }
  646. sub setProperties {
  647.    logit("Enter subroutine setProperties");
  648.    my ($cookie,$properties,$message,$duration,$url,$path,$bgline);
  649.    # Compare the selected properties with the ones set in this users
  650.    # default theme, where applicable. If they are different, then
  651.    # update a properties cookie. These parameters were passed in by
  652.    # names that make no sense, in order to cut down on global variables.
  653.    # $schema holds the value for $schema_cols.
  654.    # $schema_cols is the number of columns wide to display the toplevel
  655.    # schema list.
  656.    $schema_cols = $schema;
  657.    # $explainschema holds the value for $fontsize.
  658.    # If not set, use value from theme.
  659.    $fontsize = $explainschema;
  660.    # $expire holds the value for $menufontsize.
  661.    # If not set, default to '2'.
  662.    $menufontsize = $expire;
  663.    # $statement_id holds the value for TEXTAREA width
  664.    $textarea_w = $statement_id;
  665.    # $user holds the value for TEXTAREA height
  666.    $textarea_h = $user;
  667.    # $whereclause holds the value for how many rows to display.
  668.    $rowdisplay = $whereclause;
  669.    $properties = "$schema_cols%$fontsize%$menufontsize%$textarea_w%$textarea_h%$rowdisplay";
  670.    $path = dirname($scriptname);
  671.    $cookie = cookie(-name=>"OracletoolProps",-value=>"$properties",-path=>"$path",-expires=>"+10y");
  672.    print header(-cookie=>[$cookie]);
  673.    $message     = "Your personal Oracletool preferences have been updated.<BR>Oracletool will restart with a connection to instance $database.";
  674.    $duration    = "4";
  675.    $url         = "$scriptname?database=$database&object_type=FRAMEPAGE";
  676.    $bgline = "<BODY BGCOLOR=$bgcolor>n";
  677.    if ($bgimage) {
  678.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$bgimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$bgimage")) {
  679.          logit("   Background image is $ENV{'DOCUMENT_ROOT'}/$bgimage and is readable");
  680.          $bgline = "<BODY BACKGROUND=$bgimage>n";
  681.       }
  682.    }
  683.    print <<"EOF";
  684. <HTML>
  685.   <HEAD>
  686.     <TITLE>Properties have been reset.</TITLE>
  687.     <META HTTP-EQUIV="Refresh" Content="$duration;URL=$url">
  688.   </HEAD>
  689.   $bgline
  690.     <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  691.     <CENTER>
  692.       $message
  693.     </CENTER
  694.   </BODY
  695. </HTML>
  696. EOF
  697.    logit("Exit subroutine setProperties");
  698.    exit;
  699. }
  700. sub showProps {
  701.    logit("Enter subroutine showProps");
  702.    # Display a menu for selecting non-default properties for the tool.
  703.    # These will be stored as cookies.
  704.    message("Oracletool preferences<BR>Setting these values will override values set in any theme.<BR>Submit changes or select theme at the bottom of this screen.");
  705.    my ($fontsizeoverride,$fontoverride,$val);
  706.    print <<"EOF";
  707. <FORM METHOD="POST" ACTION="$scriptname" TARGET="_top">
  708. <TABLE BORDER=0 ALIGN=LEFT>
  709.   <TR WIDTH=50%>
  710.     <TD ALIGN=CENTER>
  711.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  712.       <INPUT TYPE=HIDDEN NAME='database' VALUE='$database'>
  713.       <INPUT TYPE=HIDDEN NAME='object_type' VALUE='SETPROPS'>
  714.       <INPUT TYPE=SUBMIT NAME='foobar' VALUE='Submit changes'>
  715.     </TD>
  716.   </TR>
  717.   <TR>
  718.     <TD VALIGN="TOP">
  719.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  720.       <B>
  721.       Schema list column number:<BR>
  722.       This sets the number of columns in the schema list table.<BR>
  723. EOF
  724.    # Loop through the values, in order to check the box which is the
  725.    # value of what is set now.
  726.       foreach $val ('3','4','5','6','7') {
  727.          print "      <INPUT TYPE=RADIO NAME='schema' VALUE='$val'";
  728.          if ($val == $schema_cols) {
  729.             print " CHECKED>$valn";
  730.          } else {
  731.             print " >$valn";
  732.          }
  733.       }
  734. print <<"EOF";
  735.       <HR WIDTH='50%' ALIGN='LEFT'>
  736.     </TD>
  737.   </TR>
  738.   <TR>
  739.     <TD VALIGN="TOP">
  740.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  741.       <B>
  742.       Font size override:<BR>
  743.       This will override the font size set by your theme.<BR>
  744. EOF
  745.    # Loop through the values, in order to check the box which is the
  746.    # value of what is set now.
  747.       foreach $val ('1','2','3','4','5','6','7') {
  748.          print "<INPUT TYPE=RADIO NAME='explainschema' VALUE='$val'";
  749.          if ($val == $fontsize) {
  750.             print " CHECKED>$valn";
  751.          } else {
  752.             print " >$valn";
  753.          }
  754.       }
  755. print <<"EOF";
  756.       <HR WIDTH='50%' ALIGN='LEFT'>
  757.     </TD>
  758.   </TR>
  759.   <TR>
  760.     <TD VALIGN="TOP">
  761.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  762.       <B>
  763.       Menu button font size override:<BR>
  764.       This will override the menu button font size set by your theme.<BR>
  765. EOF
  766.    # Loop through the values, in order to check the box which is the
  767.    # value of what is set now.
  768.       foreach $val ('1','2','3','4') {
  769.          print "<INPUT TYPE=RADIO NAME='expire' VALUE='$val'";
  770.          if ($val == $menufontsize) {
  771.             print " CHECKED>$valn";
  772.          } else {
  773.             print " >$valn";
  774.          }
  775.       }
  776. print <<"EOF";
  777.       <HR WIDTH='50%' ALIGN='LEFT'>
  778.     </TD>
  779.   </TR>
  780.   <TR>
  781.     <TD VALIGN="TOP">
  782.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  783.       <B>
  784.       Textarea width:<BR>
  785.       Width in characters of the SQL editing area.<BR>
  786. EOF
  787.       foreach $val ('30','40','50','60','70','80','100','125','150') {
  788.          print "<INPUT TYPE=RADIO NAME='statement_id' VALUE='$val'";
  789.          if ($val == $textarea_w) {
  790.             print " CHECKED>$valn";
  791.          } else {
  792.             print " >$valn";
  793.          }
  794.       }
  795. print <<"EOF";
  796.       <HR WIDTH='50%' ALIGN='LEFT'>
  797.     </TD>
  798.   </TR>
  799.   <TR>
  800.     <TD VALIGN="TOP">
  801.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  802.       <B>
  803.       Textarea height:<BR>
  804.       Height in characters of the SQL editing area.<BR>
  805. EOF
  806.       foreach $val ('5','10','15','20','25','30','35','40','45','50') {
  807.          print "<INPUT TYPE=RADIO NAME='user' VALUE='$val'";
  808.          if ($val == $textarea_h) {
  809.             print " CHECKED>$valn";
  810.          } else {
  811.             print " >$valn";
  812.          }
  813.       }
  814. print <<"EOF";
  815.       <HR WIDTH='50%' ALIGN='LEFT'>
  816.     </TD>
  817.   </TR>
  818.   <TR>
  819.     <TD VALIGN="TOP">
  820.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  821.       <B>
  822.       Row display default:<BR>
  823.       Number of rows to return on a table/view row display.<BR>
  824. EOF
  825.       foreach $val ('1','5','25','50','100','250','500','all') {
  826.          print "<INPUT TYPE=RADIO NAME='whereclause' VALUE='$val'";
  827.          if ($val eq $rowdisplay) {
  828.             print " CHECKED>$valn";
  829.          } else {
  830.             print " >$valn";
  831.          }
  832.       }
  833. print <<"EOF";
  834.       <HR WIDTH='50%' ALIGN='LEFT'>
  835.     </TD>
  836.   </TR>
  837.   <TR WIDTH=50%>
  838.     <TD ALIGN=CENTER>
  839.       <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  840.       <INPUT TYPE=HIDDEN NAME='database' VALUE='$database'>
  841.       <INPUT TYPE=HIDDEN NAME='object_type' VALUE='SETPROPS'>
  842.       <INPUT TYPE=SUBMIT NAME='foobar' VALUE='Submit changes'>
  843.     </TD>
  844.   </TR>
  845.   </FORM>
  846.   <TR>
  847. </TABLE>
  848. EOF
  849.    logit("Exit subroutine showProps");
  850. }
  851. sub showThemes {
  852.    logit("Enter subroutine showThemes");
  853.    # Display all of the themes.
  854.    my ($currenttheme,@themevars);
  855.    $currenttheme = $theme;
  856.    text("Select a color theme for your default.<BR>Your current theme is "$currenttheme".");
  857.    foreach $theme (sort keys %themes) {
  858.       logit("   Displaying theme $theme");
  859.       @themevars        = @{ $themes{$theme} };
  860.       $description      = $themevars[0]  or $description      = "undefined";
  861.       $bgcolor          = $themevars[1]  or $bgcolor          = "undefined";
  862.       $menuimage        = $themevars[2]  or $menuimage        = "undefined";
  863.       $bgimage          = $themevars[3]  or $bgimage          = "undefined";
  864.       $fontcolor        = $themevars[4]  or $fontcolor        = "undefined";
  865.       $headingfontcolor = $themevars[5]  or $fontcolor        = "undefined";
  866.       $infocolor        = $themevars[6]  or $infocolor        = "undefined";
  867.       $linkcolor        = $themevars[7]  or $linkcolor        = "undefined";
  868.       $font             = $themevars[8]  or $font             = "undefined";
  869.       $headingfont      = $themevars[9]  or $font             = "undefined";
  870.       $fontsize         = $themevars[10] or $fontsize         = "undefined";
  871.       $headingcolor     = $themevars[11] or $headingcolor     = "undefined";
  872.       $cellcolor        = $themevars[12] or $cellcolor        = "undefined";
  873.       $bordercolor      = $themevars[13] or $bordercolor      = "undefined";
  874.       print <<"EOF";
  875. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  876.   <TR>
  877.     <TD VALIGN="TOP" WIDTH=100%>
  878.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1 WIDTH=100%>
  879.         <TR>
  880.           <TD BGCOLOR='$bgcolor'>
  881.             <TABLE CELLPADDING=20>
  882.               <TH><A HREF=$scriptname?database=$database&object_type=SETTHEME&arg=$theme TARGET=_top>$theme</A></TH>
  883.               <TR>
  884.                 <TD BGCOLOR=$bgcolor ALIGN=CENTER><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  885.                   <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  886.                     <TR>
  887.                       <TD VALIGN="TOP" WIDTH=100%>
  888.                         <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1 WIDTH=100%>
  889.                             <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Table headings</TH>
  890.                             <TR ALIGN="CENTER">
  891.                               <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  892.                                Table cells
  893.                               </TD>
  894.                           </TR>
  895.                         </TABLE>
  896.                       </TD>
  897.                     </TR>
  898.                   </TABLE><FONT COLOR='$linkcolor' SIZE='$fontsize' FACE='$font'><BR>link color
  899.                 </TD>
  900.               </TR>
  901.             </TABLE>
  902.           </TD>
  903.         </TR>
  904.       </TABLE>
  905.     </TD>
  906.   </TR>
  907. </TABLE>
  908. <P>
  909. EOF
  910.    }
  911.    logit("Exit subroutine showThemes");
  912. }
  913. sub validateIndex {
  914.    logit("Enter subroutine validateIndex");
  915.    my ($sql,$text,$link);
  916.    $sql = "
  917. VALIDATE INDEX $schema.$object_name
  918. ";
  919.    runSQL($sql);
  920.    $sql = "$copyright
  921. SELECT
  922.    REPEAT_COUNT "Repeat count",
  923.    KEYS_WITH_REPEAT_COUNT "Keys with repeat count"
  924. FROM INDEX_HISTOGRAM
  925. ";
  926.    $text = "This table shows the number of times that one or more index keys is repeated in the table, and the number of index keys that are repeated that many times.";
  927.    $link = "";
  928.    DisplayTable($sql,$text,$link);
  929.    $sql = "$copyright
  930. SELECT
  931.    HEIGHT "Height",
  932.    TO_CHAR(BLOCKS,'999,999,999,999') "Blocks",
  933.    TO_CHAR(LF_ROWS,'999,999,999,999') "Leaf rows",
  934.    TO_CHAR(LF_BLKS,'999,999,999,999') "Leaf blocks",
  935.    TO_CHAR(LF_ROWS_LEN,'999,999,999,999') "Leaf row sum",
  936.    TO_CHAR(LF_BLK_LEN,'999,999,999,999') "Leaf block usable space",
  937.    TO_CHAR(BR_ROWS,'999,999,999,999') "Branch rows #",
  938.    TO_CHAR(BR_BLKS,'999,999,999,999') "Branch blocks #",
  939.    TO_CHAR(BR_ROWS_LEN,'999,999,999,999') "Blocks length sum",
  940.    TO_CHAR(BR_BLK_LEN,'999,999,999,999') "Branch block usable space",
  941.    TO_CHAR(DEL_LF_ROWS,'999,999,999,999') "Deleted leaf rows #",
  942.    TO_CHAR(DEL_LF_ROWS_LEN,'999,999,999,999') "Deleted rows length",
  943.    TO_CHAR(DISTINCT_KEYS,'999,999,999,999') "Distinct keys #",
  944.    TO_CHAR(MOST_REPEATED_KEY,'999,999,999,999') "Most repeated key #",
  945.    TO_CHAR(BTREE_SPACE,'999,999,999,999') "Total space allocated",
  946.    TO_CHAR(USED_SPACE,'999,999,999,999') "Total space used",
  947.    TO_CHAR(PCT_USED,'999')||'%' "Percent used",
  948.    TO_CHAR(ROWS_PER_KEY,'999,999,999,999') "Rows per distinct key",
  949.    TO_CHAR(BLKS_GETS_PER_ACCESS,'999,999,999,999') "Block gets per access"
  950. FROM INDEX_STATS
  951. ";
  952.    $text = "Index statistics.";
  953.    $link = "";
  954.    DisplayTable($sql,$text,$link);
  955.    logit("Exit subroutine validateIndex");
  956. }
  957. sub showIndex {
  958.    logit("Enter subroutine showIndex");
  959.    my ($sql,$text,$link,$foo,$partitioned);   
  960. # Index structure
  961.    $sql = "$copyright 
  962. SELECT 
  963.    TABLE_NAME "Table name",
  964.    TABLE_OWNER "Owner",
  965.    COLUMN_NAME "Column name", 
  966.    COLUMN_LENGTH "Column length" 
  967. FROM DBA_IND_COLUMNS 
  968.    WHERE INDEX_NAME = '$object_name' 
  969. AND INDEX_OWNER = '$schema' 
  970.    ORDER BY COLUMN_POSITION
  971. ";
  972.    $object_type = lc $object_type;
  973.    $text = "Structure of $object_type $object_name";
  974.    $link = "";
  975.    DisplayTable($sql,$text,$link);
  976. # General
  977.    $sql = "$copyright
  978. SELECT  
  979.    A.TABLESPACE_NAME "Tablespace name", 
  980.    TO_CHAR(B.CREATED,'Month DD, YYYY - HH24:MI')        "Date created",
  981.    TO_CHAR(B.LAST_DDL_TIME,'Month DD, YYYY - HH24:MI')  "Last DDL time",
  982.    TO_CHAR(A.EXTENTS,'999,999,999,999') "Extents", 
  983.    TO_CHAR(A.INITIAL_EXTENT,'999,999,999,999') "Initial extent", 
  984.    TO_CHAR(A.NEXT_EXTENT,'999,999,999,999') "Next extent",
  985.    TO_CHAR(A.MAX_EXTENTS,'999,999,999,999') "Max extents",
  986.    TO_CHAR(A.BYTES,'999,999,999,999') "Bytes",
  987.    B.STATUS "Status"
  988. FROM DBA_SEGMENTS A, DBA_OBJECTS B
  989.    WHERE A.SEGMENT_NAME = '$object_name' 
  990.    AND A.SEGMENT_TYPE = 'INDEX' 
  991.    AND A.OWNER = '$schema'
  992.    AND B.OBJECT_NAME = '$object_name'
  993.    AND B.OBJECT_TYPE = 'INDEX'
  994.    AND B.OWNER = '$schema'
  995. ";
  996.    $object_type = lc $object_type;
  997.    $text = "General info: $object_type $object_name";
  998.    $link = "";
  999.    DisplayTable($sql,$text,$link);
  1000. # Check to see if index is partitioned, if Oracle8
  1001.    if ($oracle8) {
  1002.       $sql = "$copyright
  1003. SELECT
  1004.    PARTITIONED
  1005. FROM DBA_INDEXES
  1006.    WHERE INDEX_NAME = '$object_name'
  1007.    AND OWNER = '$schema'
  1008. ";
  1009.       $cursor=$dbh->prepare($sql);
  1010.       $cursor->execute;
  1011.       $foo = $cursor->fetchrow_array;
  1012.       $cursor->finish;
  1013.       if ($foo eq "YES") {
  1014.          $partitioned = "Yep";
  1015.       }
  1016.    }
  1017. # If partitioned, show some additional info.
  1018.    if ($partitioned) {
  1019.       $sql = "$copyright
  1020. SELECT
  1021.    PARTITION_NAME                               "Partition name",
  1022.    TABLESPACE_NAME                              "Tablespace",
  1023.    PARTITION_POSITION                           "Position",
  1024.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999')    "Initial",
  1025.    TO_CHAR(NEXT_EXTENT,'999,999,999,999')       "Next",
  1026.    TO_CHAR(MAX_EXTENT,'999,999,999,999')        "Max extents",
  1027.    PCT_INCREASE                                 "Pct increase",
  1028.    HIGH_VALUE                                   "High value",
  1029.    HIGH_VALUE_LENGTH                            "High value length",
  1030.    LOGGING                                      "Logging"
  1031. FROM DBA_IND_PARTITIONS
  1032.    WHERE INDEX_NAME = '$object_name'
  1033.    AND INDEX_OWNER = '$schema'
  1034. ORDER BY PARTITION_POSITION
  1035. ";
  1036.       $text = "Partitions contained in this index";
  1037.       $link = "$scriptname?database=$database&schema=$schema&object_type=INDEX+PARTITION&index_name=$object_name";
  1038.       DisplayTable($sql,$text,$link);
  1039.    }
  1040.    if (checkPriv("ANALYZE ANY")) {
  1041.       print <<"EOF";
  1042. <FORM METHOD="GET" ACTION="$scriptname">
  1043.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1044.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1045.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  1046.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="$object_name">
  1047.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="VALIDATEINDEX">
  1048.   <INPUT TYPE="SUBMIT" NAME="foo" VALUE="Validate index for detailed statistics.">
  1049. </FORM>
  1050. EOF
  1051.    }
  1052.    logit("Exit subroutine showIndex");
  1053. }
  1054. sub showIndexPart {
  1055.    logit("Enter subroutine showIndexPart");
  1056.    my ($sql,$cursor,$isanalyzed,$text,$link,$infotext,$index_name);
  1057.    $index_name = $query->param('index_name');
  1058.    $sql = "$copyright
  1059. SELECT
  1060.    PARTITION_NAME                               "Partition name",
  1061.    INDEX_NAME                                   "Index name",
  1062.    INDEX_OWNER                                  "Owner",
  1063.    TABLESPACE_NAME                              "Tablespace",
  1064.    PARTITION_POSITION                           "Position",
  1065.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999')    "Initial",
  1066.    TO_CHAR(NEXT_EXTENT,'999,999,999,999')       "Next",
  1067.    TO_CHAR(MAX_EXTENT,'999,999,999,999')        "Max extents",
  1068.    PCT_INCREASE                                 "Pct increase",
  1069.    HIGH_VALUE                                   "High value",
  1070.    HIGH_VALUE_LENGTH                            "High value length",
  1071.    LOGGING                                      "Logging"
  1072. FROM DBA_IND_PARTITIONS
  1073.    WHERE PARTITION_NAME = '$object_name'
  1074.    AND INDEX_NAME = '$index_name'
  1075.    AND INDEX_OWNER = '$schema'
  1076. ";
  1077.    $object_type = lc $object_type;
  1078.    $text = "General info: $object_type $object_name";
  1079.    $link = "";
  1080.    DisplayTable($sql,$text,$link);
  1081.    logit("Exit subroutine showIndexPart");
  1082. }
  1083. sub showTablePart {
  1084.    logit("Enter subroutine showTablePart");
  1085.    my ($sql,$cursor,$isanalyzed,$text,$link,$infotext,$table_name);
  1086.    $table_name = $query->param('table_name');
  1087. # General info
  1088.    $sql = "$copyright
  1089. SELECT 
  1090.    PARTITION_NAME "Partition name",
  1091.    TABLE_NAME "Table name",
  1092.    TABLE_OWNER "Owner",
  1093.    TABLESPACE_NAME "Tablespace",
  1094.    PARTITION_POSITION "Position",
  1095.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999') "Initial",
  1096.    TO_CHAR(NEXT_EXTENT,'999,999,999,999') "Next",
  1097.    TO_CHAR(MAX_EXTENT,'999,999,999,999') "Max extents",
  1098.    PCT_INCREASE "Pct increase",
  1099.    HIGH_VALUE "High value",
  1100.    HIGH_VALUE_LENGTH "High value length",
  1101.    LOGGING "Logging"
  1102. FROM DBA_TAB_PARTITIONS
  1103.    WHERE PARTITION_NAME = '$object_name'
  1104.    AND TABLE_NAME = '$table_name'
  1105.    AND TABLE_OWNER = '$schema'
  1106. ";
  1107.    $object_type = lc $object_type;
  1108.    $text = "General info: $object_type $object_name";
  1109.    $link = "";
  1110.    DisplayTable($sql,$text,$link);
  1111. # Check to see if partition has been analyzed.
  1112.    $sql = "$copyright
  1113. SELECT 
  1114.    DISTINCT LAST_ANALYZED
  1115. FROM DBA_TAB_PARTITIONS
  1116.    WHERE PARTITION_NAME = '$object_name'
  1117.    AND TABLE_OWNER = '$schema'
  1118. ";
  1119.    $cursor=$dbh->prepare($sql);
  1120.    logit("   Error: $DBI::errstr") if $DBI::errstr;
  1121.    $cursor->execute;
  1122.    $isanalyzed = $cursor->fetchrow_array;
  1123.    logit("   Isanalyzed for partition $schema.$object_name is $isanalyzed");
  1124.    $cursor->finish;
  1125.    if ($isanalyzed) {
  1126.       $sql = "$copyright
  1127. SELECT
  1128.    TO_CHAR((BLOCKS / (EMPTY_BLOCKS+BLOCKS)) *100,'999.99')||'%'      "Percent used",
  1129.    TO_CHAR(NUM_ROWS,'999,999,999,999')                          "Row count",
  1130.    TO_CHAR(BLOCKS,'999,999,999,999')                            "Blocks",
  1131.    TO_CHAR(EMPTY_BLOCKS,'999,999,999,999')                      "Empty blocks",
  1132.    TO_CHAR(AVG_SPACE,'999,999,999,999')                         "Average space",
  1133.    TO_CHAR(AVG_ROW_LEN,'999,999,999,999')                       "Average row length",
  1134.    TO_CHAR(CHAIN_CNT,'999,999,999,999')                         "Chain count",
  1135.    TO_CHAR(LAST_ANALYZED,'Month DD, YYYY') "Last analyzed"
  1136. FROM DBA_TAB_PARTITIONS
  1137.    WHERE PARTITION_NAME = '$object_name'
  1138.    AND TABLE_OWNER = '$schema'
  1139. ";
  1140.       $text = "Analyzation info: $object_type $object_name";
  1141.       $link = "";
  1142.       DisplayTable($sql,$text,$link);
  1143.    } else {
  1144.       message("Partition has never been analyzed. Extended info will not be shown.");
  1145.    }
  1146.    logit("Exit subroutine showTablePart");
  1147. }
  1148. sub showCluster {
  1149.    logit("Enter subroutine showCluster");
  1150.    my ($sql,$text,$link,$infotext);
  1151.    $sql = "$copyright
  1152. SELECT
  1153.    TABLESPACE_NAME "Tablespace name",
  1154.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999') "Initial extent",
  1155.    TO_CHAR(NEXT_EXTENT,'999,999,999,999') "Next extent",
  1156.    TO_CHAR(MAX_EXTENTS,'999,999,999,999') "Max extents",
  1157.    CLUSTER_TYPE "Cluster type",
  1158.    FUNCTION "Function",
  1159.    INSTANCES "Instances",
  1160.    SINGLE_TABLE "Single table"
  1161. FROM DBA_CLUSTERS 
  1162.    WHERE CLUSTER_NAME = '$object_name'
  1163.    AND OWNER = '$schema'
  1164. ";
  1165.    logit ("   $sql");
  1166.    $text = "General info: Cluster $object_name";
  1167.    $link = "";
  1168.    DisplayTable($sql,$text,$link);
  1169.    $sql = "$copyright
  1170. SELECT
  1171.    TABLE_NAME "Table_name",
  1172.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999') "Initial extent",
  1173.    TO_CHAR(NEXT_EXTENT,'999,999,999,999') "Next extent",
  1174.    TO_CHAR(MAX_EXTENTS,'999,999,999,999') "Max extents"
  1175. FROM DBA_TABLES
  1176.    WHERE CLUSTER_NAME = '$object_name'
  1177.    AND OWNER = '$schema'
  1178. ";
  1179.    $text = "Tables belonging to cluster $object_name";
  1180.    $infotext = "No tables belong to cluster $object_name";
  1181.    $link = "$scriptname?database=$database&schema=$schema&object_type=TABLE";
  1182.    DisplayTable($sql,$text,$link,$infotext);
  1183.     
  1184.    logit("Exit subroutine showCluster");
  1185. }
  1186.    
  1187. sub showTable {
  1188.    logit("Enter subroutine showTable");
  1189.    my ($sql,$text,$link,$infotext,$cursor,$isanalyzed,$partitioned,$grantcount,$foo);
  1190.    my (@columns,$cols,$constraint_name,$column_name,$status,$index_name,$tablespace_name);
  1191.    my ($indexes,$cursor1,$sql1,$uniqueness,$initial_extent,$next_extent,$max_extents);
  1192.    my ($r_owner,$r_constraint_name,$count,$r_table_name,$iot_type,$temporary,$index_type);
  1193.    print <<"EOF";
  1194. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1195.   <TR>
  1196.     <TD WIDTH=100%>
  1197.       <TABLE BORDER=0 cellpadding=5 cellspacing=1>
  1198.         <TR>
  1199.           <TD BGCOLOR=$headingcolor>
  1200.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  1201.               <TR>
  1202.                 <TD ALIGN=CENTER>
  1203.                   <FORM METHOD="GET" ACTION="$scriptname">
  1204.                     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1205.                     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1206.                     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="TABLEROWS">
  1207.                     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  1208.                     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="$object_name">
  1209.                     <INPUT TYPE="SUBMIT" NAME="tablerows" VALUE="Display $rowdisplay rows of this table">
  1210.                 </TD>
  1211.               </TR>
  1212.               <TR>
  1213.                 <TD ALIGN=CENTER><FONT COLOR=$fontcolor SIZE=$fontsize><B><I>where</I></B></FONT></TD>
  1214.               </TR>
  1215.               <TR>
  1216.                 <TD ALIGN=CENTER>
  1217.                     <INPUT TYPE="TEXT" SIZE=30 NAME="whereclause">
  1218.                 </TD> 
  1219.                   </FORM>
  1220.               </TR>
  1221.             </TABLE>
  1222.           </TD>
  1223.         </TR>
  1224.       </TABLE>
  1225.     </TD>
  1226.   </TR>
  1227. </TABLE>
  1228. EOF
  1229. $grantcount = showGrantButton();
  1230. unless ($grantcount) {
  1231.    print "<BR>";
  1232. }
  1233. print <<"EOF";
  1234. <TABLE BORDER=0 CELLPADDING=5 CELLSPACING=1>
  1235.   <TR>
  1236.     <TD ALIGN=CENTER>
  1237.       <FORM METHOD=POST ACTION=$scriptname>
  1238.         <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1239.         <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1240.         <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="TABLEDDL">
  1241.         <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  1242.         <INPUT TYPE="HIDDEN" NAME="arg" VALUE="$schema.$object_name">
  1243.         <INPUT TYPE="SUBMIT" NAME="foo" VALUE="Generate DDL">
  1244.       </FORM>
  1245.     </TD>
  1246.     <TD ALIGN=CENTER>
  1247.       <FORM METHOD=POST ACTION=$scriptname>
  1248.         <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1249.         <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1250.         <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="OBJECTFRAGMAP">
  1251.         <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  1252.         <INPUT TYPE="HIDDEN" NAME="arg" VALUE="$object_name">
  1253.         <INPUT TYPE="SUBMIT" NAME="foo" VALUE="Extent mapping">
  1254.       </FORM>
  1255.     </TD>
  1256.   </TR>
  1257. </TABLE>
  1258. EOF
  1259. # Table structure
  1260.    $sql = "$copyright
  1261. SELECT
  1262.    A.COLUMN_NAME                                 "Column name",
  1263.    A.DATA_TYPE                                   "Type",
  1264.    A.DATA_LENGTH                                 "Length",
  1265.    A.DATA_PRECISION                              "Precision",
  1266.    B.DATA_DEFAULT                                "Default",
  1267.    TO_CHAR(A.LAST_ANALYZED,'Month DD, YYYY')     "Last analyzed"
  1268.    FROM
  1269.           (SELECT
  1270.              TABLE_NAME, 
  1271.              OWNER,
  1272.              COLUMN_ID, 
  1273.              COLUMN_NAME,
  1274.              DATA_TYPE, 
  1275.              DATA_LENGTH, 
  1276.              DATA_PRECISION,
  1277.              LAST_ANALYZED
  1278.              FROM DBA_TAB_COLUMNS
  1279.           WHERE (TABLE_NAME = '$object_name') 
  1280.           AND (OWNER = '$schema') 
  1281.           AND (DATA_TYPE <> 'NUMBER')
  1282.            UNION
  1283.            SELECT
  1284.              TABLE_NAME, 
  1285.              OWNER,
  1286.              COLUMN_ID, 
  1287.              COLUMN_NAME,
  1288.              DATA_TYPE, 
  1289.              DATA_PRECISION, 
  1290.              DATA_SCALE,
  1291.              LAST_ANALYZED
  1292.              FROM DBA_TAB_COLUMNS
  1293.            WHERE (TABLE_NAME = '$object_name') 
  1294.            AND (OWNER = '$schema') 
  1295.            AND (DATA_TYPE = 'NUMBER')
  1296.           ) A,
  1297.         DBA_TAB_COLUMNS B
  1298.    WHERE (A.TABLE_NAME = B.TABLE_NAME) 
  1299.    AND (A.OWNER = B.OWNER) 
  1300.    AND (A.COLUMN_ID = B.COLUMN_ID)
  1301. ORDER BY b.COLUMN_ID
  1302. ";
  1303.    $object_type = lc $object_type;
  1304.    $text = "Structure of $object_type $object_name";
  1305.    $link = "";
  1306.    DisplayTable($sql,$text,$link);
  1307. # Check to see if table has been analyzed.
  1308.    $sql = "$copyright
  1309. SELECT 
  1310.    DISTINCT LAST_ANALYZED
  1311. FROM DBA_TAB_COLUMNS
  1312.    WHERE TABLE_NAME = '$object_name'
  1313.    AND OWNER = '$schema'
  1314. ";
  1315.    $cursor=$dbh->prepare($sql);
  1316.    $cursor->execute;
  1317.    $isanalyzed = $cursor->fetchrow_array;
  1318.    $cursor->finish;
  1319. # If the table has been analyzed, show some additional information
  1320.    if ($isanalyzed) {
  1321.       $sql = "$copyright
  1322. SELECT 
  1323.    TO_CHAR((BLOCKS / (EMPTY_BLOCKS+BLOCKS)) *100,'999.99')||'%' "Percent used",
  1324.    TO_CHAR(NUM_ROWS,'999,999,999,999') "Row count",
  1325.    TO_CHAR(BLOCKS,'999,999,999,999') "Blocks",
  1326.    TO_CHAR(EMPTY_BLOCKS,'999,999,999,999') "Empty blocks",
  1327.    TO_CHAR(AVG_SPACE,'999,999,999,999') "Average space",
  1328.    TO_CHAR(AVG_ROW_LEN,'999,999,999,999') "Average row length",
  1329.    TO_CHAR(CHAIN_CNT,'999,999,999,999') "Chain count"
  1330. FROM DBA_TABLES 
  1331.    WHERE TABLE_NAME = '$object_name'
  1332.    AND OWNER = '$schema'
  1333. ";
  1334.       $text = "Analyzation info: $object_type $object_name";
  1335.       $link = "";
  1336.       DisplayTable($sql,$text,$link);
  1337.    } else {
  1338.       message("Table has never been analyzed. Extended info will not be shown.");
  1339.    }
  1340. # Gather some info for later queries
  1341. # These can be used to determine what 
  1342. # type of table we are dealing with.
  1343. # PARTITIONED: YES/NO
  1344. # IOT_TYPE: IOT/NULL
  1345. # TEMPORARY: Y/N
  1346.    if ($oracle8) {
  1347.       $sql = "$copyright
  1348. SELECT
  1349.    PARTITIONED,
  1350.    IOT_TYPE,
  1351.    TEMPORARY
  1352. FROM DBA_TABLES
  1353.    WHERE TABLE_NAME = '$object_name'
  1354.    AND OWNER = '$schema'
  1355. ";
  1356.       $cursor = $dbh->prepare($sql);
  1357.       $cursor->execute;
  1358.       ($partitioned,$iot_type,$temporary) = $cursor->fetchrow_array;
  1359.       $cursor->finish;
  1360.    }
  1361.    if ($iot_type eq "IOT") {
  1362.       message("Table $object_name is an Index Organized Table.");
  1363.    } else {
  1364. # General info
  1365.       $sql = "$copyright
  1366. SELECT 
  1367.    A.TABLESPACE_NAME "Tablespace", 
  1368.    TO_CHAR(B.CREATED,'Month DD, YYYY - HH24:MI') "Date created",
  1369.    TO_CHAR(B.LAST_DDL_TIME,'Month DD, YYYY - HH24:MI') "Last DDL time",
  1370.    TO_CHAR(A.EXTENTS,'999,999,999,999') "Extents", 
  1371.    TO_CHAR(A.INITIAL_EXTENT,'999,999,999,999') "Initial extent", 
  1372.    TO_CHAR(A.NEXT_EXTENT,'999,999,999,999') "Next extent", 
  1373.    TO_CHAR(A.MAX_EXTENTS,'999,999,999,999') "Max extents",
  1374.    TO_CHAR(A.BYTES,'999,999,999,999') "Bytes",
  1375.    A.PCT_INCREASE "% increase",
  1376.    DECODE(C.CACHE,
  1377. '    Y','Yes',
  1378.                 '    N','No') "Cache?"
  1379. FROM DBA_SEGMENTS A, DBA_OBJECTS B, DBA_TABLES C
  1380.    WHERE A.SEGMENT_NAME = '$object_name' 
  1381.    AND A.SEGMENT_TYPE = 'TABLE' 
  1382.    AND A.OWNER = '$schema'
  1383.    AND B.OBJECT_NAME = '$object_name'
  1384.    AND B.OBJECT_TYPE = 'TABLE'
  1385.    AND B.OWNER = '$schema'
  1386.    AND C.TABLE_NAME = '$object_name'
  1387.    AND C.OWNER = '$schema'
  1388. ";
  1389.       $object_type = lc $object_type;
  1390.       $text = "General info: $object_type $object_name";
  1391.       $link = "$scriptname?database=$database&object_type=TSINFO";
  1392.       DisplayTable($sql,$text,$link);
  1393.    }
  1394. # Check to see if table is partitioned, if Oracle8
  1395.    if ($partitioned) {
  1396.       
  1397.       $sql = "$copyright
  1398. SELECT
  1399.    PARTITIONED
  1400. FROM DBA_TABLES
  1401.    WHERE TABLE_NAME = '$object_name'
  1402.    AND OWNER = '$schema'
  1403. ";
  1404.       $cursor=$dbh->prepare($sql);
  1405.       $cursor->execute;
  1406.       $foo = $cursor->fetchrow_array;
  1407.       $cursor->finish;
  1408.       if ($foo eq "YES") {
  1409.          $partitioned = "Yep";
  1410.       }
  1411.    }
  1412. # If partitioned, show some additional info.
  1413.    if ($partitioned) {
  1414.       $sql = "$copyright
  1415. SELECT
  1416.    PARTITION_NAME                               "Partition name",
  1417.    TABLESPACE_NAME                              "Tablespace",
  1418.    PARTITION_POSITION                           "Position",
  1419.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999')    "Initial",
  1420.    TO_CHAR(NEXT_EXTENT,'999,999,999,999')       "Next",
  1421.    TO_CHAR(MAX_EXTENT,'999,999,999,999')        "Max extents",
  1422.    PCT_INCREASE                                 "Pct increase",
  1423.    HIGH_VALUE                                   "High value",
  1424.    HIGH_VALUE_LENGTH                            "High value length",
  1425.    LOGGING                                      "Logging"
  1426. FROM DBA_TAB_PARTITIONS
  1427.    WHERE TABLE_NAME = '$object_name'
  1428.    AND TABLE_OWNER = '$schema'
  1429. ORDER BY PARTITION_POSITION
  1430. ";
  1431.       $text = "Partitions contained in this table";
  1432.       $link = "$scriptname?database=$database&schema=$schema&object_type=TABLE+PARTITION&table_name=$object_name";
  1433.       DisplayTable($sql,$text,$link);
  1434.    }
  1435. # Show primary key (if)
  1436.    $sql = "$copyright
  1437. SELECT 
  1438.    CONSTRAINT_NAME "Constraint name",
  1439.    STATUS "Status"
  1440. FROM DBA_CONSTRAINTS 
  1441.    WHERE  CONSTRAINT_TYPE = 'P' 
  1442. AND TABLE_NAME = '$object_name' 
  1443. AND OWNER = '$schema'
  1444. ";
  1445.    $cursor = $dbh->prepare($sql);
  1446.    $cursor->execute;
  1447.    (($constraint_name,$status) = $cursor->fetchrow);
  1448.    $cursor->finish;
  1449.    if ($constraint_name) {
  1450.       $sql = "$copyright
  1451. SELECT COLUMN_NAME
  1452.    FROM DBA_CONS_COLUMNS
  1453. WHERE CONSTRAINT_NAME = '$constraint_name'
  1454. AND OWNER = '$schema'
  1455.    ORDER BY POSITION
  1456. ";
  1457.       $cursor = $dbh->prepare($sql);
  1458.       $cursor->execute;
  1459.       while ($column_name = $cursor->fetchrow_array) {
  1460.          push @columns, $column_name;
  1461.       }
  1462.       $cursor->finish;
  1463.       if ($#columns > 0) {
  1464.          $cols = join(",", @columns);
  1465.          $cols =~ s/^,//;
  1466.       } else {
  1467.          $cols = $columns[0];
  1468.       }
  1469.       text("Primary key");
  1470.    print <<"EOF";
  1471. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1472.   <TR>
  1473.     <TD WIDTH=100%>
  1474.       <TABLE BORDER=0 cellpadding=2 cellspacing=1>
  1475.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Constraint name</TH>
  1476.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  1477.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Column(s)</TH>
  1478.         <TR ALIGN=LEFT>
  1479.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$scriptname?database=$database&schema=$schema&object_type=INDEX&arg=$constraint_name>$constraint_name</A></TD>
  1480.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>
  1481.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$cols</TD>
  1482.         </TR>
  1483.       </TABLE>
  1484.     </TD>
  1485.   </TR>
  1486. </TABLE>
  1487. EOF
  1488.    } else {
  1489.       message("This table has no primary key.");
  1490.    }
  1491. # Count indexes
  1492.    $sql = "$copyright
  1493. SELECT COUNT(*) 
  1494.    FROM DBA_INDEXES
  1495. WHERE TABLE_NAME = '$object_name'
  1496.    AND OWNER = '$schema'
  1497. ";
  1498.    $cursor = $dbh->prepare($sql);
  1499.    $cursor->execute;
  1500.    while ($index_name = $cursor->fetchrow_array) {
  1501.       $indexes++;
  1502.    }
  1503.    $cursor->finish;
  1504.    
  1505.    if ($indexes) {
  1506.       text("Indexes");
  1507.       if ($oracle7) {
  1508.          print <<"EOF";
  1509. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1510.   <TR>
  1511.     <TD WIDTH=100%>
  1512.       <TABLE BORDER=0 cellpadding=2 cellspacing=1>
  1513.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Index name</TH>
  1514.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  1515.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Column(s)</TH>
  1516.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Tablespace name</TH>
  1517.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Unique?</TH>
  1518.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Initial</TH>
  1519.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Next</TH>
  1520.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Max</TH>
  1521. EOF
  1522.          $sql = "$copyright
  1523. SELECT 
  1524.    INDEX_NAME "Index name",
  1525.    STATUS "Status",
  1526.    TABLESPACE_NAME "Tablespace name",
  1527.    DECODE(UNIQUENESS,
  1528.       'UNIQUE','Yes',
  1529.       'NONUNIQUE','No') "Unique?",
  1530.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999') "Initial extent",
  1531.    TO_CHAR(NEXT_EXTENT,'999,999,999,999') "Next extent",
  1532.    TO_CHAR(MAX_EXTENTS,'999,999,999,999') "Max extents"
  1533.    FROM DBA_INDEXES
  1534. WHERE TABLE_NAME = '$object_name'
  1535.    AND OWNER = '$schema'
  1536. ";
  1537.          $cursor = $dbh->prepare($sql);
  1538.          $cursor->execute;
  1539.          while (($index_name,$status,$tablespace_name,$uniqueness,$initial_extent,$next_extent,$max_extents) = $cursor->fetchrow) {
  1540.             undef @columns;
  1541.             $indexes++;
  1542.             $sql1 = "$copyright
  1543. SELECT COLUMN_NAME
  1544.    FROM DBA_IND_COLUMNS
  1545. WHERE INDEX_NAME = '$index_name'
  1546. AND INDEX_OWNER = '$schema'
  1547.    ORDER BY COLUMN_POSITION
  1548. ";
  1549.             $cursor1 = $dbh->prepare($sql1);
  1550.             $cursor1->execute;
  1551.             while ($column_name = $cursor1->fetchrow_array) {
  1552.                push @columns, $column_name;
  1553.             }
  1554.             $cursor1->finish;
  1555.             if ($#columns > 0) {
  1556.                $cols = join(",", @columns);
  1557.                $cols =~ s/^,//;
  1558.             } else {
  1559.                $cols = $columns[0];
  1560.             }
  1561.             print <<"EOF";
  1562.         <TR ALIGN=LEFT>
  1563.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$scriptname?database=$database&schema=$schema&object_type=INDEX&arg=$index_name>$index_name</A></TD>
  1564.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>
  1565.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$cols</TD>
  1566.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$tablespace_name</TD>
  1567.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$uniqueness</TD>
  1568.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$initial_extent</TD>
  1569.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$next_extent</TD>
  1570.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$max_extents</TD>
  1571.         </TR>
  1572. EOF
  1573.          }
  1574.          print <<"EOF";
  1575.       </TABLE>
  1576.     </TD>
  1577.   </TR>
  1578. </TABLE>
  1579. EOF
  1580.       }
  1581.       if ($oracle8) {
  1582.          print <<"EOF";
  1583. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1584.   <TR>
  1585.     <TD WIDTH=100%>
  1586.       <TABLE BORDER=0 cellpadding=2 cellspacing=1>
  1587.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Index name</TH>
  1588.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Index type</TH>
  1589.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  1590.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Column(s)</TH>
  1591.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Tablespace name</TH>
  1592.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Unique?</TH>
  1593.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Initial</TH>
  1594.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Next</TH>
  1595.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Max</TH>
  1596. EOF
  1597.          $sql = "$copyright
  1598. SELECT 
  1599.    INDEX_NAME "Index name",
  1600.    INDEX_TYPE "Index type",
  1601.    STATUS "Status",
  1602.    TABLESPACE_NAME "Tablespace name",
  1603.    DECODE(UNIQUENESS,
  1604.       'UNIQUE','Yes',
  1605.       'NONUNIQUE','No') "Unique?",
  1606.    TO_CHAR(INITIAL_EXTENT,'999,999,999,999') "Initial extent",
  1607.    TO_CHAR(NEXT_EXTENT,'999,999,999,999') "Next extent",
  1608.    TO_CHAR(MAX_EXTENTS,'999,999,999,999') "Max extents"
  1609.    FROM DBA_INDEXES
  1610. WHERE TABLE_NAME = '$object_name'
  1611.    AND OWNER = '$schema'
  1612. ";
  1613.          $cursor = $dbh->prepare($sql);
  1614.          $cursor->execute;
  1615.          while (($index_name,$index_type,$status,$tablespace_name,$uniqueness,$initial_extent,$next_extent,$max_extents) = $cursor->fetchrow) {
  1616.             undef @columns;
  1617.             $indexes++;
  1618.             $sql1 = "$copyright
  1619. SELECT COLUMN_NAME
  1620.    FROM DBA_IND_COLUMNS
  1621. WHERE INDEX_NAME = '$index_name'
  1622. AND INDEX_OWNER = '$schema'
  1623.    ORDER BY COLUMN_POSITION
  1624. ";
  1625.             $cursor1 = $dbh->prepare($sql1);
  1626.             $cursor1->execute;
  1627.             while ($column_name = $cursor1->fetchrow_array) {
  1628.                push @columns, $column_name;
  1629.             }
  1630.             $cursor1->finish;
  1631.             if ($#columns > 0) {
  1632.                $cols = join(",", @columns);
  1633.                $cols =~ s/^,//;
  1634.             } else {
  1635.                $cols = $columns[0];
  1636.             }
  1637.             print <<"EOF";
  1638.         <TR ALIGN=LEFT>
  1639.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$scriptname?database=$database&schema=$schema&object_type=INDEX&arg=$index_name>$index_name</A></TD>
  1640.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$index_type</TD>
  1641.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>
  1642.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$cols</TD>
  1643.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$tablespace_name</TD>
  1644.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$uniqueness</TD>
  1645.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$initial_extent</TD>
  1646.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$next_extent</TD>
  1647.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$max_extents</TD>
  1648.         </TR>
  1649. EOF
  1650.          }
  1651.          print <<"EOF";
  1652.       </TABLE>
  1653.     </TD>
  1654.   </TR>
  1655. </TABLE>
  1656. EOF
  1657.       }
  1658.    } else {
  1659.       message("This table has no indexes");
  1660.    }
  1661. # Show column constraints (if)
  1662.    $sql = "$copyright
  1663. SELECT 
  1664.    CONSTRAINT_NAME "Constraint name", 
  1665.    SEARCH_CONDITION "Search condition", 
  1666.    STATUS "Status" 
  1667. FROM DBA_CONSTRAINTS 
  1668.    WHERE CONSTRAINT_TYPE NOT IN ('P','R')
  1669. AND TABLE_NAME = '$object_name' 
  1670. AND OWNER = '$schema'
  1671.    ORDER BY TABLE_NAME, CONSTRAINT_NAME
  1672. ";
  1673.    $text = "Column constraints";
  1674.    $link = "";
  1675.    $infotext = "This table has no column constraints.";
  1676.    DisplayTable($sql,$text,$link,$infotext);
  1677. # Show foreign key constraints (if)
  1678.    $count = "";
  1679.    $sql = "$copyright
  1680. SELECT 
  1681.    COUNT(*)
  1682. FROM DBA_CONSTRAINTS
  1683.    WHERE CONSTRAINT_TYPE = 'R'
  1684.    AND OWNER = '$schema'
  1685.    AND TABLE_NAME = '$object_name'
  1686. ";
  1687.    $cursor = $dbh->prepare($sql);
  1688.    $cursor->execute;
  1689.    $count = $cursor->fetchrow_array;
  1690.    $cursor->finish;
  1691.    if ($count) {
  1692.       text("Foreign key constraints");
  1693.       print <<"EOF";
  1694. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1695.   <TR>
  1696.     <TD WIDTH=100%>
  1697.       <TABLE BORDER=0 cellpadding=2 cellspacing=1>
  1698.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Constraint name</TH>
  1699.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  1700.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Column(s)</TH>
  1701.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Ref owner</TH>
  1702.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Ref table</TH>
  1703.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Ref constraint</TH>
  1704. EOF
  1705.       $sql = "$copyright
  1706. SELECT
  1707.    CONSTRAINT_NAME,
  1708.    STATUS,
  1709.    R_OWNER,
  1710.    R_CONSTRAINT_NAME
  1711. FROM DBA_CONSTRAINTS
  1712.    WHERE CONSTRAINT_TYPE = 'R'
  1713.    AND OWNER = '$schema'
  1714.    AND TABLE_NAME = '$object_name'
  1715. ";
  1716.       $cursor = $dbh->prepare($sql);
  1717.       $cursor->execute;
  1718.       while (($constraint_name,$status,$r_owner,$r_constraint_name) = $cursor->fetchrow_array) {
  1719. # Add the columns
  1720.          $sql1 = "$copyright
  1721.    SELECT
  1722. COLUMN_NAME
  1723.    FROM DBA_CONS_COLUMNS
  1724. WHERE OWNER = '$schema'
  1725. AND CONSTRAINT_NAME = '$constraint_name'
  1726. ";
  1727.          $cursor1 = $dbh->prepare($sql1);
  1728.          $cursor1->execute;
  1729.          undef @columns;
  1730.          while ($column_name = $cursor1->fetchrow_array) {
  1731.             push @columns, $column_name;
  1732.          }
  1733.          $cursor1->finish;
  1734.          if ($#columns > 0) {
  1735.             $cols = join(",", @columns);
  1736.             $cols =~ s/^,//;
  1737.          } else {
  1738.             $cols = $columns[0];
  1739.          }
  1740. # Get the referenced table name 
  1741.          $sql1 = "$copyright
  1742. SELECT
  1743.    TABLE_NAME
  1744. FROM DBA_CONSTRAINTS
  1745.    WHERE OWNER = '$r_owner'
  1746.    AND CONSTRAINT_NAME = '$r_constraint_name'
  1747. ";
  1748.          $cursor1 = $dbh->prepare($sql1);
  1749.          $cursor1->execute;
  1750.          $r_table_name = $cursor1->fetchrow_array;
  1751.          $cursor1->finish;
  1752.          print <<"EOF";
  1753.         <TR ALIGN=LEFT>
  1754.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$constraint_name</TD>
  1755.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>
  1756.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$cols</TD>
  1757.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$r_owner</TD>
  1758.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$r_table_name</TD>
  1759.           <TD VALIGN=TOP BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$r_constraint_name</TD>
  1760.         </TR>
  1761. EOF
  1762.       }
  1763.       print <<"EOF";
  1764.       </TABLE>
  1765.     </TD>
  1766.   </TR>
  1767. </TABLE>
  1768. EOF
  1769.    } else {
  1770.       message("This table has no foreign key constraints.");
  1771.    }
  1772. # Foreign keys referencing this table (if)
  1773.    $sql = "$copyright
  1774. SELECT
  1775.    CONSTRAINT_NAME "Child constraint name",
  1776.    OWNER "Child owner",
  1777.    TABLE_NAME "Child table name",
  1778.    STATUS "Status",
  1779.    R_CONSTRAINT_NAME "Local constraint name"
  1780. FROM DBA_CONSTRAINTS
  1781.    WHERE R_OWNER = '$schema'
  1782.    AND R_CONSTRAINT_NAME IN 
  1783.    ( SELECT
  1784.         CONSTRAINT_NAME
  1785.      FROM DBA_CONSTRAINTS
  1786.         WHERE TABLE_NAME = '$object_name'
  1787.         AND OWNER = '$schema')
  1788. ";
  1789.    $text = "Foreign key constraints referencing $object_name";
  1790.    $link = "";
  1791.    $infotext = "There are no foreign key constraints referencing this table.";
  1792.    DisplayTable($sql,$text,$link,$infotext);
  1793.    $sql = "$copyright
  1794. SELECT
  1795.    SYNONYM_NAME "Synonym name",
  1796.    OWNER "Owner",
  1797.    DB_LINK "DB link"
  1798. FROM DBA_SYNONYMS
  1799.    WHERE TABLE_NAME = '$object_name'
  1800.    AND TABLE_OWNER = '$schema'
  1801. ";
  1802.    $text = "Synonyms pointing to this table.";
  1803.    $link = "";
  1804.    $infotext = "There are no synonyms pointing to this table.";
  1805.    DisplayTable($sql,$text,$link,$infotext);
  1806.    
  1807.    $sql = "$copyright
  1808. SELECT 
  1809.    TRIGGER_NAME "Trigger name",
  1810.    TRIGGERING_EVENT "Event",
  1811.    WHEN_CLAUSE "When clause"
  1812. FROM DBA_TRIGGERS
  1813.    WHERE TABLE_NAME = '$object_name'
  1814.    AND OWNER = '$schema'
  1815. ";
  1816.    $text = "Triggers";
  1817.    $link = "$scriptname?database=$database&schema=$schema&object_type=TRIGGER";
  1818.    $infotext = "This table has no triggers.";
  1819.    DisplayTable($sql,$text,$link,$infotext);
  1820.    logit("Exit subroutine showTable");
  1821. }
  1822. sub userDDL {
  1823.    logit("Enter subroutine userDDL");
  1824. # This sub generates DDL to recreate a user.
  1825. # This sub needs to updated for Oracle8 / 8i
  1826.    my ($sql,$cursor,$password,$default_tablespace,$temporary_tablespace,$profile);
  1827.    my ($max_bytes,$tablespace_name,$granted_role,$admin_option,$default_role,$ddl);
  1828.    my ($privilege,$owner,$table_name,$grantable,$grantor,$sql1,$cursor1,@default_roles);
  1829.    my ($roles);
  1830.    $sql = "$copyright
  1831. SELECT 
  1832.    PASSWORD,
  1833.    DEFAULT_TABLESPACE,
  1834.    TEMPORARY_TABLESPACE,
  1835.    PROFILE
  1836. FROM DBA_USERS 
  1837.    WHERE USERNAME = '$schema'
  1838. ";   
  1839.    $cursor = $dbh->prepare($sql);
  1840.    $cursor->execute;
  1841.    ($password,$default_tablespace,$temporary_tablespace,$profile) = $cursor->fetchrow_array;
  1842.    $cursor->finish;
  1843.    print <<"EOF";
  1844. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1845.   <TR>
  1846.     <TD WIDTH=100%>
  1847.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1848.         <TR>
  1849.           <TD BGCOLOR='$cellcolor'>
  1850.             <PRE>
  1851. EOF
  1852. # Put in some remarks
  1853.    $ddl  = "/*nDDL generated by Oracletool v$VERSIONn";
  1854.    $ddl .= "for user $schema n*/nn";
  1855.    
  1856. # Create the SQL
  1857.    $ddl .= "
  1858. CREATE USER $schema
  1859.    IDENTIFIED BY VALUES '$password'
  1860.    DEFAULT TABLESPACE $default_tablespace
  1861.    TEMPORARY TABLESPACE $temporary_tablespace
  1862.    PROFILE $profile
  1863. /
  1864. ";
  1865. # Add quotas
  1866.    $sql = "$copyright
  1867. SELECT 
  1868.    MAX_BYTES,
  1869.    TABLESPACE_NAME
  1870. FROM DBA_TS_QUOTAS
  1871.    WHERE USERNAME = '$schema'
  1872. ";
  1873.    $cursor=$dbh->prepare($sql);
  1874.    $cursor->execute;
  1875.    while (($max_bytes,$tablespace_name) = $cursor->fetchrow_array) {
  1876.       if ($max_bytes eq "-1") {
  1877.          $max_bytes = "UNLIMITED";
  1878.       }
  1879.       $ddl .= "
  1880. ALTER USER $schema QUOTA $max_bytes ON $tablespace_name;";
  1881.    }
  1882.    $cursor->finish;
  1883. # Add grants
  1884. # Roles first
  1885.    $sql = "$copyright
  1886. SELECT 
  1887.    GRANTED_ROLE,
  1888.    ADMIN_OPTION,
  1889.    DEFAULT_ROLE
  1890. FROM DBA_ROLE_PRIVS
  1891.    WHERE GRANTEE = '$schema'
  1892. ";
  1893.    $cursor = $dbh->prepare($sql);
  1894.    $cursor->execute;
  1895.    while (($granted_role,$admin_option,$default_role) = $cursor->fetchrow_array) {
  1896.       $ddl .= "
  1897. GRANT $granted_role TO $schema";
  1898.       if ($admin_option eq "YES") {
  1899.          $ddl .= " WITH ADMIN OPTION;";
  1900.       } else {
  1901.          $ddl .= ";";
  1902.       }
  1903.       if ($default_role eq "YES") {
  1904.          push @default_roles, $granted_role;
  1905.       }
  1906.    }
  1907.    $cursor->finish;
  1908.    if (@default_roles) {
  1909.       $roles = join(",",@default_roles);
  1910.       $ddl .= "nALTER USER $schema DEFAULT ROLE $roles;";
  1911.    }
  1912. # Explicit system privileges
  1913.    $sql = "$copyright
  1914. SELECT 
  1915.    PRIVILEGE,
  1916.    ADMIN_OPTION
  1917. FROM DBA_SYS_PRIVS
  1918.    WHERE GRANTEE = '$schema'
  1919. ";
  1920.    $cursor = $dbh->prepare($sql);
  1921.    $cursor->execute;
  1922.    while (($privilege,$admin_option) = $cursor->fetchrow_array) {
  1923.             $ddl .= "
  1924. GRANT $privilege TO $schema";
  1925.       if ($admin_option eq "YES") {
  1926.          $ddl .= " WITH ADMIN OPTION;";
  1927.       } else {
  1928.          $ddl .= ";";
  1929.       }
  1930.    }
  1931.    print "$ddln";
  1932. # Explicit object privileges
  1933.    $sql = "$copyright
  1934. SELECT DISTINCT GRANTOR
  1935.    FROM DBA_TAB_PRIVS 
  1936. WHERE GRANTEE = '$schema'
  1937. ";
  1938.    $cursor = $dbh->prepare($sql);
  1939.    $cursor->execute;
  1940.    while ($grantor = $cursor->fetchrow_array) {
  1941.       print "n/* Grants from $grantor */nn";
  1942.       print "CONNECT $grantor/passwordnn";
  1943.       $sql1 = "$copyright
  1944. SELECT 
  1945.    PRIVILEGE,
  1946.    OWNER,
  1947.    TABLE_NAME,
  1948.    GRANTABLE
  1949. FROM DBA_TAB_PRIVS
  1950.    WHERE GRANTOR = '$grantor'
  1951.    AND GRANTEE = '$schema'
  1952.    ORDER BY TABLE_NAME
  1953. ";
  1954.       $cursor1 = $dbh->prepare($sql1);
  1955.       $cursor1->execute;
  1956.       while (($privilege,$owner,$table_name,$grantable) = $cursor1->fetchrow) {
  1957.          print "GRANT $privilege ON $owner.$table_name TO $schema";
  1958.          if ($grantable eq "YES") {
  1959.             print " WITH GRANT OPTION;n";
  1960.          } else {
  1961.             print ";n";
  1962.          }
  1963.       }
  1964.       $cursor1->finish;
  1965.    }
  1966.    $cursor->finish;
  1967.    
  1968. # finish the HTML
  1969. print <<"EOF";
  1970.             </PRE>
  1971.           </TD>
  1972.         </TR>
  1973.      </TABLE>
  1974.     </TD>
  1975.   </TR>
  1976. </TABLE>
  1977. EOF
  1978.    logit("Exit subroutine userDDL");
  1979. }
  1980. sub rbsDDL {
  1981.    logit("Enter subroutine rbsDDL");
  1982.    my ($sql,$cursor,$ddl);
  1983.    my ($owner,$tablespace_name,$initial_extent,$next_extent);
  1984.    my ($min_extents,$max_extents,$pct_increase,$status,$optsize);
  1985.    print <<"EOF";
  1986. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1987.   <TR>
  1988.     <TD WIDTH=100%>
  1989.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1990.         <TR>
  1991.           <TD BGCOLOR='$cellcolor'>
  1992.             <PRE>
  1993. EOF
  1994. # Put in some remarks
  1995.    $ddl  = "/*nDDL generated by Oracletool v$VERSIONn";
  1996.    $ddl .= "for tablespace $object_name n*/nn";
  1997. # Start the command
  1998.    $ddl .= "CREATE ROLLBACK SEGMENT $object_namen";
  1999.    $sql = "$copyright
  2000. SELECT
  2001.    DRS.OWNER,
  2002.    DRS.TABLESPACE_NAME,
  2003.    DRS.INITIAL_EXTENT,
  2004.    DRS.NEXT_EXTENT,
  2005.    DRS.MIN_EXTENTS,
  2006.    DRS.MAX_EXTENTS,
  2007.    DRS.PCT_INCREASE,
  2008.    DRS.STATUS,
  2009.    NVL(TO_CHAR(VRS.OPTSIZE,'999,999,999,999'),'Not set')
  2010. FROM DBA_ROLLBACK_SEGS DRS, V$ROLLSTAT VRS
  2011.    WHERE DRS.SEGMENT_NAME = '$object_name'
  2012.    AND VRS.USN = DRS.SEGMENT_ID
  2013. ";
  2014.    $cursor = $dbh->prepare($sql);
  2015.    $cursor->execute;
  2016.    ($owner,$tablespace_name,$initial_extent,$next_extent,$min_extents,$max_extents,$pct_increase,$status,$optsize)
  2017.       = $cursor->fetchrow_array;
  2018.    $cursor->finish;
  2019.    $ddl .= "   TABLESPACE $tablespace_namen";
  2020.    $ddl .= "   STORAGEn";
  2021.    $ddl .= "   (n";
  2022.    $ddl .= "      INITIAL      $initial_extentn";
  2023.    $ddl .= "      NEXT         $next_extentn";
  2024.    $ddl .= "      MINEXTENTS   $min_extentsn";
  2025.    $ddl .= "      MAXEXTENTS   $max_extentsn";
  2026.    if ($optsize) {
  2027.       $ddl .= "      OPTIMAL      $optsizen";
  2028.    }
  2029.    $ddl .= "   )n";
  2030.    $ddl .= "/nn";
  2031.    if ($status eq "ONLINE") {
  2032.       $ddl .= "ALTER ROLLBACK SEGMENT $object_name ONLINEn/nn";
  2033.    }
  2034.    print $ddl;
  2035. # finish the HTML
  2036.    print <<"EOF";
  2037.             </PRE>
  2038.           </TD>
  2039.         </TR>
  2040.      </TABLE>
  2041.     </TD>
  2042.   </TR>
  2043. </TABLE>
  2044. EOF
  2045.    logit("Exit subroutine rbsDDL");
  2046. }
  2047.    
  2048.    
  2049. sub tsDDL {
  2050.    logit("Enter subroutine tsDDL");
  2051.    logit("   Tablespace: $object_name");
  2052.    my ($sql,$cursor,$file_name,$file_id,$bytes,$ddl);
  2053.    my ($initial_extent,$next_extent,$min_extents);
  2054.    my ($max_extents,$pctincrease,$contents,$status,$not_first_file);
  2055.    my ($min_extlen,$logging,$autoextensible,$increment_by,$maxbytes);
  2056.    my ($extent_management,$allocation_type,$count);
  2057.    print <<"EOF";
  2058. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  2059.   <TR>
  2060.     <TD WIDTH=100%>
  2061.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  2062.         <TR>
  2063.           <TD BGCOLOR='$cellcolor'>
  2064.             <PRE>
  2065. EOF
  2066. # Put in some remarks
  2067.    $ddl  = "/*nDDL generated by Oracletool v$VERSIONn";
  2068.    $ddl .= "for tablespace $object_name n*/nn";
  2069. # Start the command
  2070.    $ddl .= "CREATE TABLESPACE $object_namen";
  2071. # Get the first datafile
  2072.    if ($oracle7) {
  2073.       $sql = "$copyright
  2074. SELECT
  2075.    FILE_NAME,
  2076.    BYTES
  2077. FROM DBA_DATA_FILES
  2078.    WHERE TABLESPACE_NAME = '$object_name'
  2079. ORDER BY FILE_ID ASC
  2080. ";
  2081.       $cursor = $dbh->prepare($sql);
  2082.       $cursor->execute; 
  2083.       ($file_name, $bytes) = $cursor->fetchrow;
  2084.       $cursor->finish;
  2085.       $ddl .= "   DATAFILE '$file_name' SIZE $bytesn";
  2086.    }
  2087.    if (($oracle8) || ($oracle8i)) {
  2088.       $sql = "$copyright
  2089. SELECT
  2090.    FILE_NAME,
  2091.    BYTES,
  2092.    AUTOEXTENSIBLE,
  2093.    MAXBYTES,
  2094.    INCREMENT_BY
  2095. FROM DBA_DATA_FILES
  2096.    WHERE TABLESPACE_NAME = '$object_name'
  2097. ORDER BY FILE_ID ASC
  2098. ";
  2099.       $cursor = $dbh->prepare($sql);
  2100.       $cursor->execute;
  2101.       ($file_name, $bytes,$autoextensible,$maxbytes,$increment_by)
  2102.          = $cursor->fetchrow_array;
  2103.       $cursor->finish;
  2104.       $increment_by = $increment_by*$db_block_size;
  2105.       $ddl .= "   DATAFILE '$file_name' SIZE $bytesn";
  2106.       if ($autoextensible eq "YES") {
  2107.          $ddl .= "      AUTOEXTEND ON NEXT $increment_by MAXSIZE $maxbytesn";
  2108.       } else {
  2109.          $ddl .= "      AUTOEXTEND OFFn";
  2110.       }
  2111.    }
  2112.    if ($oracle7) {
  2113.       $sql = "$copyright
  2114. SELECT
  2115.    INITIAL_EXTENT,
  2116.    NEXT_EXTENT,
  2117.    MIN_EXTENTS,
  2118.    MAX_EXTENTS,
  2119.    PCT_INCREASE,
  2120.    STATUS,
  2121.    CONTENTS 
  2122. FROM DBA_TABLESPACES
  2123.   WHERE TABLESPACE_NAME = '$object_name'
  2124. ";
  2125.       $cursor = $dbh->prepare($sql);
  2126.       $cursor->execute;
  2127.       ($initial_extent,$next_extent,$min_extents,$max_extents,
  2128.        $pctincrease,$status,$contents) = $cursor->fetchrow_array;
  2129.       $cursor->finish;
  2130.       $ddl .= "   DEFAULT STORAGE (n";
  2131.       $ddl .= "                     INITIAL     $initial_extentn";
  2132.       $ddl .= "                     NEXT        $initial_extentn";
  2133.       $ddl .= "                     MINEXTENTS  $min_extentsn";
  2134.       $ddl .= "                     MAXEXTENTS  $max_extentsn";
  2135.       $ddl .= "                     PCTINCREASE $pctincreasen";
  2136.       $ddl .= "                   )n";
  2137.       $ddl .= "   $contentsn";
  2138.       $ddl .= "   $statusn";
  2139.    }
  2140.    if (($oracle8) && (! $oracle8i)) {
  2141.       $sql = "$copyright
  2142. SELECT
  2143.    INITIAL_EXTENT,
  2144.    NEXT_EXTENT,
  2145.    MIN_EXTENTS,
  2146.    MAX_EXTENTS,
  2147.    PCT_INCREASE,
  2148.    MIN_EXTLEN,
  2149.    STATUS,
  2150.    CONTENTS,
  2151.    LOGGING
  2152. FROM DBA_TABLESPACES
  2153.   WHERE TABLESPACE_NAME = '$object_name'
  2154. ";
  2155.       $cursor = $dbh->prepare($sql);
  2156.       $cursor->execute;
  2157.       ($initial_extent,$next_extent,$min_extents,$max_extents,$pctincrease,$min_extlen,
  2158.          $status,$contents,$logging) = $cursor->fetchrow_array;
  2159.       $cursor->finish;
  2160.       $ddl .= "   DEFAULT STORAGE (n";
  2161.       $ddl .= "                     INITIAL     $initial_extentn";
  2162.       $ddl .= "                     NEXT        $initial_extentn";
  2163.       $ddl .= "                     MINEXTENTS  $min_extentsn";
  2164.       $ddl .= "                     MAXEXTENTS  $max_extentsn";
  2165.       $ddl .= "                     PCTINCREASE $pctincreasen";
  2166.       $ddl .= "                   )n";
  2167.       if ($min_extlen) {
  2168.          $ddl .= "   MINIMUM EXTENT $min_extlenn";
  2169.       }
  2170.       $ddl .= "   $contentsn";
  2171.       $ddl .= "   $loggingn";
  2172.       $ddl .= "   $statusn";
  2173.    }
  2174.    if ($oracle8i) {
  2175.       $sql = "$copyright
  2176. SELECT
  2177.    INITIAL_EXTENT,
  2178.    NEXT_EXTENT,
  2179.    MIN_EXTENTS,
  2180.    MAX_EXTENTS,
  2181.    PCT_INCREASE,
  2182.    MIN_EXTLEN,
  2183.    STATUS,
  2184.    CONTENTS,
  2185.    LOGGING,
  2186.    EXTENT_MANAGEMENT,
  2187.    ALLOCATION_TYPE
  2188. FROM DBA_TABLESPACES
  2189.   WHERE TABLESPACE_NAME = '$object_name'
  2190. ";
  2191.       $cursor = $dbh->prepare($sql);
  2192.       $cursor->execute;
  2193.       ($initial_extent,$next_extent,$min_extents,$max_extents,$pctincrease,$min_extlen,
  2194.          $status,$contents,$logging,$extent_management,$allocation_type) = $cursor->fetchrow_array;
  2195.       $cursor->finish;
  2196.  
  2197.       if (($min_extlen) && ($allocation_type eq "USER")) {
  2198.          $ddl .= "   MINIMUM EXTENT $min_extlenn";
  2199.       }
  2200.       if ($extent_management eq "LOCAL") {
  2201.          $ddl .= "   EXTENT MANAGEMENT LOCALn";
  2202.          if ($allocation_type eq "UNIFORM") {
  2203.             $ddl .= "      UNIFORM SIZE $initial_extentn";
  2204.          } else {
  2205.             $ddl .= "      AUTOALLOCATEn";
  2206.          }
  2207.       } else {
  2208.          $ddl .= "   EXTENT MANAGEMENT DICTIONARYn";
  2209.          $ddl .= "   DEFAULT STORAGE (n";
  2210.          $ddl .= "                     INITIAL     $initial_extentn";
  2211.          $ddl .= "                     NEXT        $initial_extentn";
  2212.          $ddl .= "                     MINEXTENTS  $min_extentsn";
  2213.          $ddl .= "                     MAXEXTENTS  $max_extentsn";
  2214.          $ddl .= "                     PCTINCREASE $pctincreasen";
  2215.          $ddl .= "                   )n";
  2216.       }
  2217.       
  2218.    $ddl .= "   $contentsn";
  2219.    $ddl .= "   $loggingn";
  2220.    $ddl .= "   $statusn";
  2221.    }
  2222.    $ddl .= "/nn";
  2223.    print $ddl;
  2224.    undef $ddl;
  2225. # Add the additional datafiles, if any
  2226.    $sql = "$copyright
  2227. SELECT 
  2228.    COUNT(*) 
  2229. FROM DBA_DATA_FILES 
  2230.    WHERE TABLESPACE_NAME = '$object_name'
  2231. ";
  2232.    $cursor = $dbh->prepare($sql);
  2233.    $cursor->execute;
  2234.    $count = $cursor->fetchrow_array;
  2235.    $cursor->finish;
  2236.    if ($count > 1) {
  2237.       if ($oracle7) {
  2238.          $sql = "$copyright
  2239. SELECT
  2240.    FILE_NAME,
  2241.    BYTES
  2242. FROM DBA_DATA_FILES
  2243.    WHERE TABLESPACE_NAME = '$object_name'
  2244. ORDER BY FILE_ID ASC
  2245. ";
  2246.          $cursor = $dbh->prepare($sql);
  2247.          $cursor->execute;
  2248.          while (($file_name, $bytes) = $cursor->fetchrow) {
  2249.             if ($not_first_file) {
  2250.                $ddl .= "ALTER TABLESPACE $object_namen   ADD DATAFILE '$file_name' SIZE $bytesn/nn";
  2251.             }
  2252.             $not_first_file++;
  2253.          }
  2254.          $cursor->finish;
  2255.       }
  2256.       if (($oracle8) || ($oracle8i)) {
  2257.          $sql = "$copyright
  2258. SELECT
  2259.    FILE_NAME,
  2260.    BYTES,
  2261.    AUTOEXTENSIBLE,
  2262.    MAXBYTES,
  2263.    INCREMENT_BY
  2264. FROM DBA_DATA_FILES
  2265.    WHERE TABLESPACE_NAME = '$object_name'
  2266. ORDER BY FILE_ID ASC
  2267. ";
  2268.          $cursor = $dbh->prepare($sql);
  2269.          $cursor->execute;
  2270.          while (($file_name,$bytes,$autoextensible,$maxbytes,$increment_by)
  2271.             = $cursor->fetchrow_array) {
  2272.             if ($not_first_file) {
  2273.                $ddl .= "ALTER TABLESPACE $object_namen   ADD DATAFILE '$file_name' SIZE $bytesn";
  2274.                if ($autoextensible eq "YES") {
  2275.                   $increment_by = $increment_by*$db_block_size;
  2276.                   $ddl .= "      AUTOEXTEND ON NEXT $increment_by MAXSIZE $maxbytesn";
  2277.                } else {
  2278.                   $ddl .= "      AUTOEXTEND OFFn";
  2279.                }
  2280.                $ddl .= "/nn";
  2281.             }
  2282.             $not_first_file++;
  2283.          }
  2284.          $cursor->finish;
  2285.       }
  2286.       print $ddl;
  2287.    }
  2288. # finish the HTML
  2289.    print <<"EOF";
  2290.             </PRE>
  2291.           </TD>
  2292.         </TR>
  2293.      </TABLE>
  2294.     </TD>
  2295.   </TR>
  2296. </TABLE>
  2297. EOF
  2298.    logit("Exit subroutine tsDDL");
  2299. }
  2300. sub tableDDL {
  2301.    logit("Enter subroutine tableDDL");
  2302.    logit("   Table(s): $object_name");
  2303.    my ($ddl,@columns,$column,$constraint,$primary_key,$diff,$i,$cursor1,$sql1);
  2304.    my ($data_type,$data_length,$data_precision,$data_default,$column_name,$comments);
  2305.    my ($tablespace_name,$pct_free,$pct_used,$initial_extent,$next_extent,$min_extents,$max_extents,$pct_increase);
  2306.    my ($ini_trans,$max_trans,$constraint_name,$search_condition,$status,$constraint_found);
  2307.    my ($delete_rule,$r_constraint_name,$r_owner,$r_table_name,$privilege,$grantee);
  2308.    my ($index_name,$uniqueness,$owner,$cols,$table_name,@tables,$object);
  2309.    my ($username,$param,@params,$foo,$count,$cache,$headertype);
  2310.    $username = $query->param('username') || "";
  2311.    $headertype = $query->param('headertype') || "";
  2312. # If username is set, then it is for a select list of tables
  2313. # for that schema.
  2314.    if ($username) {
  2315.       logit("   DDL is being generated for schema $username");
  2316.       @params = $query->param;
  2317.       foreach $param(@params) {
  2318.          if ($param =~ /reverse~/) {
  2319.             ($foo,$table_name) = split("~", $param);
  2320.             $object_name .= "$username.$table_name,";
  2321.          }
  2322.       }
  2323.    }
  2324.    logit("   Table names: $object_name");
  2325.    # Get rid of spaces in the table names.
  2326.    $object_name =~ s/ //g;
  2327.    # Get rid of leading and trailing commas.
  2328.    $object_name =~ s/^,//g;
  2329.    $object_name =~ s/,$//g;
  2330.    # Force uppercase
  2331.    $object_name = uc($object_name);
  2332.    # Put table names into an array.
  2333.    @tables = split(',', $object_name);
  2334. # Start the HTML, just a table around the code.
  2335. # Unless the user is downloading the sql.
  2336.    unless ($headertype eq "octet") {
  2337.       print <<"EOF";
  2338. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  2339.   <TR>
  2340.     <TD WIDTH=100%>
  2341.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  2342.         <TR>
  2343.           <TD BGCOLOR='$cellcolor'>
  2344.             <PRE>
  2345. EOF
  2346.    }
  2347. # Extract the DDL for recreation, for each table.
  2348.    foreach $object (@tables) {
  2349.       ($schema,$object_name) = split('.', $object);
  2350.       logit("   Table: $object_name Schema: $schema");
  2351.       $sql = "$copyright
  2352. SELECT COUNT(*) 
  2353.    FROM DBA_TABLES 
  2354. WHERE TABLE_NAME = '$object_name' 
  2355. AND OWNER = '$schema'
  2356. ";
  2357.       $cursor = $dbh->prepare($sql);
  2358.       $cursor->execute;
  2359.       $count = $cursor->fetchrow;
  2360.       if (! $count) {
  2361.          print "n/* Table $schema.$object_name requested but does not exist. */nn";
  2362.          next;
  2363.       }
  2364.       $cursor->finish;
  2365. # Skip if the table is partitioned.
  2366.       if ($oracle8) {
  2367.          $sql = "$copyright
  2368. SELECT PARTITIONED
  2369.    FROM DBA_TABLES
  2370. WHERE TABLE_NAME = '$object_name' 
  2371. AND OWNER = '$schema'
  2372. ";
  2373.          $cursor = $dbh->prepare($sql);
  2374.          $cursor->execute;
  2375.          $foo = $cursor->fetchrow;
  2376.          if ($foo eq "YES") {
  2377.             print "n/* Table $schema.$object_name is partitioned, not supported at this time. */nn";
  2378.             next;
  2379.          }
  2380.          $cursor->finish;
  2381.       }
  2382.          
  2383. # Get the column info ordered by position
  2384.       $sql = "$copyright
  2385. SELECT
  2386.    A.COLUMN_NAME                                 "Column name",
  2387.    A.DATA_TYPE                                   "Type",
  2388.    A.DATA_LENGTH                                 "Length",
  2389.    A.DATA_PRECISION                              "Precision",
  2390.    B.DATA_DEFAULT                                "Default"
  2391.    FROM
  2392.           (SELECT
  2393.              TABLE_NAME,
  2394.              COLUMN_NAME,
  2395.              OWNER,
  2396.              COLUMN_ID,
  2397.              DATA_TYPE,
  2398.              DATA_LENGTH,
  2399.              DATA_PRECISION
  2400.              FROM DBA_TAB_COLUMNS
  2401.           WHERE (TABLE_NAME = '$object_name')
  2402.           AND (OWNER = '$schema')
  2403.           AND (DATA_TYPE <> 'NUMBER')
  2404.            UNION
  2405.            SELECT
  2406.              TABLE_NAME,
  2407.              COLUMN_NAME,
  2408.              OWNER,
  2409.              COLUMN_ID,
  2410.              DATA_TYPE,
  2411.              DATA_PRECISION,
  2412.              DATA_SCALE
  2413.              FROM DBA_TAB_COLUMNS
  2414.            WHERE (TABLE_NAME = '$object_name')
  2415.            AND (OWNER = '$schema')
  2416.            AND (DATA_TYPE = 'NUMBER')
  2417.           ) A,
  2418.         DBA_TAB_COLUMNS B
  2419.    WHERE (A.TABLE_NAME = B.TABLE_NAME)
  2420.    AND (A.OWNER = B.OWNER)
  2421.    AND (A.COLUMN_ID = B.COLUMN_ID)
  2422. ORDER BY B.COLUMN_ID
  2423. ";
  2424. # Put in some remarks
  2425.       $ddl  = "/*nDDL generated by Oracletool v$VERSIONn";
  2426.       $ddl .= "for table $schema.$object_name n*/nn";
  2427. # Start the CREATE TABLE statement
  2428.       $ddl .= "CREATE TABLE $schema.$object_namen";
  2429.       $ddl .= "   (n";
  2430. # Get the column names, data lengths, and precision
  2431. # Also, add any DEFAULT VALUE clauses
  2432.       $cursor = $dbh->prepare($sql);
  2433.       $cursor->execute;
  2434.       while (($column_name,$data_type,$data_length,$data_precision,$data_default) = $cursor->fetchrow_array) {
  2435.          $ddl .= "      $column_name";
  2436.          $diff = (35 - length($column_name));
  2437.          for ($i = 0; $i <= $diff; $i++) {
  2438.             $ddl .=  " ";
  2439.          }
  2440.          $ddl .= "$data_type";
  2441.          if ($data_length && ($data_type ne "DATE")) {
  2442.             $ddl .= "($data_length";
  2443.             if ($data_precision) {
  2444.                $ddl .= ",$data_precision)";
  2445.             } else {
  2446.                $ddl .= ")";
  2447.             }
  2448.          }
  2449.          if ($data_default) {
  2450.             $ddl .= " DEFAULT $data_default";
  2451.          }
  2452.          $sql1 = "$copyright
  2453. SELECT
  2454.    CONSTRAINT_NAME,
  2455.    SEARCH_CONDITION,
  2456.    STATUS
  2457. FROM DBA_CONSTRAINTS
  2458.    WHERE OWNER = '$schema'
  2459.    AND TABLE_NAME = '$object_name'
  2460.    AND CONSTRAINT_TYPE = 'C'
  2461.    AND CONSTRAINT_NAME IN (
  2462. SELECT
  2463.    CONSTRAINT_NAME
  2464. FROM DBA_CONS_COLUMNS
  2465.    WHERE OWNER = '$schema'
  2466.    AND TABLE_NAME = '$object_name'
  2467.    AND COLUMN_NAME = '$column_name')
  2468. ";
  2469.          $cursor1 = $dbh->prepare($sql1);
  2470.          $cursor1->execute;
  2471.          while (($constraint_name,$search_condition,$status) = $cursor1->fetchrow) {
  2472.             next unless ($search_condition =~ /NOT NULL$/);
  2473.             $constraint_found = 1;
  2474.             if ($constraint_name) {
  2475.                if ($constraint_name =~ /SYS_/) {
  2476.                   $ddl .= "tNOT NULL";
  2477.                } else {
  2478.                   $ddl .= "tCONSTRAINT $constraint_name NOT NULL";
  2479.                }
  2480.                if ($status =~ /ENABLE/) {
  2481.                   $ddl .= " ENABLE,n";
  2482.                } else {
  2483.                   $ddl .= " DISABLE,n";
  2484.                }
  2485.             } else {
  2486.                $ddl .= ",n";
  2487.             }
  2488.          }
  2489.          unless ($constraint_found) {
  2490.             $ddl .= ",n";
  2491.          }
  2492.          $constraint_found = 0;
  2493.          $cursor1->finish;
  2494.       }
  2495.       $cursor->finish;
  2496.       $ddl =~ s/,n$/n/;
  2497.       $ddl .= "   )n";
  2498.       $sql = "$copyright
  2499. SELECT
  2500.    TABLESPACE_NAME,
  2501.    PCT_FREE,
  2502.    PCT_USED,
  2503.    INITIAL_EXTENT,
  2504.    NEXT_EXTENT,
  2505.    MIN_EXTENTS,
  2506.    MAX_EXTENTS,
  2507.    PCT_INCREASE,
  2508.    INI_TRANS,
  2509.    MAX_TRANS,
  2510.    CACHE
  2511. FROM DBA_TABLES
  2512.    WHERE TABLE_NAME = '$object_name'
  2513.    AND OWNER = '$schema'
  2514. ";
  2515.       $cursor=$dbh->prepare($sql);
  2516.       $cursor->execute;
  2517.       ($tablespace_name,$pct_free,$pct_used,$initial_extent,$next_extent,$min_extents,$max_extents,$pct_increase,$ini_trans,$max_trans,$cache) = $cursor->fetchrow_array;
  2518.       $cursor->finish;
  2519.       $ddl .= "   TABLESPACE  $tablespace_namen";
  2520.       $ddl .= "      PCTFREE  $pct_freen";
  2521.       $ddl .= "      PCTUSED  $pct_usedn";
  2522.       $ddl .= "      INITRANS $ini_transn";
  2523.       $ddl .= "      MAXTRANS $max_transn";
  2524.       $ddl .= "      STORAGE (n";
  2525.       $ddl .= "                 INITIAL     $initial_extentn";
  2526.       $ddl .= "                 NEXT        $next_extentn";
  2527.       $ddl .= "                 MINEXTENTS  $min_extentsn";
  2528.       $ddl .= "                 MAXEXTENTS  $max_extentsn";
  2529.       $ddl .= "                 PCTINCREASE $pct_increasen";
  2530.       if ($cache eq "    Y") {
  2531.          $ddl .= "              ) CACHE";
  2532.       } else {
  2533.          $ddl .= "              ) NOCACHE";
  2534.       }
  2535.       $ddl .= "n/nn";
  2536.       print "$ddl";
  2537. # Create the indexes
  2538.       $sql = "$copyright
  2539. SELECT
  2540.    INDEX_NAME,
  2541.    OWNER,
  2542.    TABLESPACE_NAME,
  2543.    UNIQUENESS,
  2544.    PCT_FREE,
  2545.    INITIAL_EXTENT,
  2546.    NEXT_EXTENT,
  2547.    MIN_EXTENTS,
  2548.    MAX_EXTENTS,
  2549.    PCT_INCREASE,
  2550.    INI_TRANS,
  2551.    MAX_TRANS
  2552. FROM DBA_INDEXES
  2553.    WHERE TABLE_NAME = '$object_name'
  2554.    AND OWNER = '$schema'
  2555. ";
  2556.       $cursor=$dbh->prepare($sql);
  2557.       $cursor->execute;
  2558.       while (($index_name,$owner,$tablespace_name,$uniqueness,$pct_free,$initial_extent,$next_extent,$min_extents,$max_extents,$pct_increase,$ini_trans,$max_trans) = $cursor->fetchrow_array) {
  2559.          undef @columns;
  2560.          $ddl = "CREATE ";
  2561.          $sql1 = "$copyright
  2562. SELECT COLUMN_NAME
  2563.    FROM DBA_IND_COLUMNS
  2564. WHERE INDEX_NAME = '$index_name'
  2565. AND INDEX_OWNER = '$owner'
  2566.    ORDER BY COLUMN_POSITION
  2567. ";
  2568.          $cursor1 = $dbh->prepare($sql1);
  2569.          $cursor1->execute;
  2570.          while ($column_name = $cursor1->fetchrow_array) {
  2571.             push @columns, $column_name;
  2572.          }
  2573.          $cursor1->finish;
  2574.          if ($#columns > 0) {
  2575.             $cols = join(",", @columns);
  2576.             $cols =~ s/^,//;
  2577.          } else {
  2578.             $cols = $columns[0];
  2579.          }
  2580.          if ($uniqueness eq "UNIQUE") {
  2581.             $ddl .= "UNIQUE INDEX $owner.$index_name ON $schema.$object_namen";
  2582.          } else {
  2583.             $ddl .= "INDEX $owner.$index_name ON $schema.$object_namen";
  2584.          }
  2585.          $ddl .= "   ($cols)n";
  2586.          $ddl .= "   TABLESPACE  $tablespace_namen";
  2587.          $ddl .= "      PCTFREE  $pct_freen";
  2588.          $ddl .= "      INITRANS $ini_transn";
  2589.          $ddl .= "      MAXTRANS $max_transn";
  2590.          $ddl .= "      STORAGE (n";
  2591.          $ddl .= "                 INITIAL     $initial_extentn";
  2592.          $ddl .= "                 NEXT        $next_extentn";
  2593.          $ddl .= "                 MINEXTENTS  $min_extentsn";
  2594.          $ddl .= "                 MAXEXTENTS  $max_extentsn";
  2595.          $ddl .= "                 PCTINCREASE $pct_increasen";
  2596.          $ddl .= "              )n/nn";
  2597.          print "$ddl";
  2598.       }
  2599.       $cursor->finish;
  2600. # Add the primary key, if one exists
  2601.       $sql = "$copyright
  2602. SELECT
  2603.    CONSTRAINT_NAME
  2604. FROM DBA_CONSTRAINTS
  2605.    WHERE TABLE_NAME = '$object_name'
  2606.    AND OWNER = '$schema'
  2607.    AND CONSTRAINT_TYPE = 'P'
  2608. ";
  2609.       $cursor=$dbh->prepare($sql);
  2610.       $cursor->execute;
  2611.       $constraint_name = $cursor->fetchrow_array;
  2612.       $cursor->finish;
  2613.       if ($constraint_name) {
  2614.          undef @columns;
  2615.          $sql1 = "$copyright
  2616. SELECT COLUMN_NAME
  2617.    FROM DBA_CONS_COLUMNS
  2618. WHERE CONSTRAINT_NAME = '$constraint_name'
  2619. AND OWNER = '$schema'
  2620.    ORDER BY POSITION
  2621. ";
  2622.          $cursor1 = $dbh->prepare($sql1);
  2623.          $cursor1->execute;
  2624.          while ($column_name = $cursor1->fetchrow_array) {
  2625.             push @columns, $column_name;
  2626.          }
  2627.          $cursor1->finish;
  2628.          if ($#columns > 0) {
  2629.             $cols = join(",", @columns);
  2630.             $cols =~ s/^,//;
  2631.          } else {
  2632.             $cols = $columns[0];
  2633.          }
  2634.          $ddl = "ALTER TABLE $schema.$object_name ADD CONSTRAINT $constraint_name PRIMARY KEY ($cols) USING INDEXn/nn";
  2635.          print "$ddl";
  2636.       }
  2637. # Add unique constraints, if they exist.
  2638.       $sql = "$copyright
  2639. SELECT
  2640.    CONSTRAINT_NAME,
  2641.    STATUS
  2642. FROM DBA_CONSTRAINTS
  2643.    WHERE TABLE_NAME = '$object_name'
  2644.    AND OWNER = '$schema'
  2645.    AND CONSTRAINT_TYPE = 'U'
  2646. ";
  2647.       $cursor=$dbh->prepare($sql);
  2648.       $cursor->execute;
  2649.       while (($constraint_name,$status) = $cursor->fetchrow_array) {
  2650.          undef @columns;
  2651.          $sql1 = "$copyright
  2652. SELECT COLUMN_NAME
  2653.    FROM DBA_CONS_COLUMNS
  2654. WHERE CONSTRAINT_NAME = '$constraint_name'
  2655. AND OWNER = '$schema'
  2656.    ORDER BY POSITION
  2657. ";
  2658.          $cursor1 = $dbh->prepare($sql1);
  2659.          $cursor1->execute;
  2660.          while ($column_name = $cursor1->fetchrow_array) {
  2661.             push @columns, $column_name;
  2662.          }
  2663.          $cursor1->finish;
  2664.          if ($#columns > 0) {
  2665.             $cols = join(",", @columns);
  2666.             $cols =~ s/^,//;
  2667.          } else {
  2668.             $cols = $columns[0];
  2669.          }
  2670.          $ddl = "ALTER TABLE $schema.$object_name ADD CONSTRAINT $constraint_name UNIQUE ($cols)";
  2671.          if ($status =~ /ENABLE/) {
  2672.             $ddl .= " ENABLEn/nn";
  2673.          } else {
  2674.             $ddl .= " DISABLEn/nn";
  2675.          }
  2676.          print "$ddl";
  2677.       }
  2678. # Add the additional check constraints.
  2679.       $sql = "$copyright
  2680. SELECT
  2681.    CONSTRAINT_NAME,
  2682.    SEARCH_CONDITION,
  2683.    STATUS
  2684. FROM DBA_CONSTRAINTS
  2685.    WHERE TABLE_NAME = '$object_name'
  2686.    AND OWNER = '$schema'
  2687.    AND CONSTRAINT_TYPE = 'C'
  2688. ";
  2689.       $cursor=$dbh->prepare($sql);
  2690.       $cursor->execute;
  2691.       while (($constraint_name,$search_condition,$status) = $cursor->fetchrow) {
  2692.          next unless ($search_condition !~ /NOT NULL$/);
  2693.          $ddl = "ALTER TABLE $schema.$object_name ADD CONSTRAINT $constraint_name CHECK ($search_condition)";
  2694.          if ($status =~ /ENABLE/) {
  2695.             $ddl .= " ENABLEn/nn";
  2696.          } else {
  2697.             $ddl .= " DISABLEn/nn";
  2698.          }
  2699.          print $ddl;
  2700.       }
  2701.       $cursor->finish;
  2702. # Add the foreign key constraints.
  2703.       $sql = "$copyright
  2704. SELECT
  2705.    CONSTRAINT_NAME,
  2706.    STATUS,
  2707.    DELETE_RULE,
  2708.    R_CONSTRAINT_NAME,
  2709.    R_OWNER
  2710. FROM DBA_CONSTRAINTS
  2711.    WHERE TABLE_NAME = '$object_name'
  2712.    AND OWNER = '$schema'
  2713.    AND CONSTRAINT_TYPE = 'R'
  2714. ";
  2715.       $cursor=$dbh->prepare($sql) or print "$DBI::errstrn";
  2716.       $cursor->execute;
  2717.       while (($constraint_name,$status,$delete_rule,$r_constraint_name,$r_owner) = $cursor->fetchrow) {
  2718.          undef @columns;
  2719.          $sql1 = "$copyright
  2720. SELECT COLUMN_NAME
  2721.    FROM DBA_CONS_COLUMNS
  2722. WHERE CONSTRAINT_NAME = '$constraint_name'
  2723. AND OWNER = '$schema'
  2724.    ORDER BY POSITION
  2725. ";
  2726.          $cursor1 = $dbh->prepare($sql1) or print "$DBI::errstrn";
  2727.          $cursor1->execute;
  2728.          while ($column_name = $cursor1->fetchrow_array) {
  2729.             push @columns, $column_name;
  2730.          }
  2731.          $cursor1->finish;
  2732.          if ($#columns > 0) {
  2733.             $cols = join(",", @columns);
  2734.             $cols =~ s/^,//;
  2735.          } else {
  2736.             $cols = $columns[0];
  2737.          }
  2738.          $ddl = "ALTER TABLE $schema.$object_name ADD CONSTRAINT $constraint_name FOREIGN KEY ($cols)";
  2739.          undef @columns;
  2740.          $sql1 = "$copyright
  2741. SELECT 
  2742.    COLUMN_NAME,
  2743.    TABLE_NAME
  2744. FROM DBA_CONS_COLUMNS
  2745.    WHERE CONSTRAINT_NAME = '$r_constraint_name'
  2746.    AND OWNER = '$r_owner'
  2747. ORDER BY POSITION
  2748. ";
  2749.          $cursor1 = $dbh->prepare($sql1) or print "$DBI::errstrn";
  2750.          $cursor1->execute;
  2751.          while (($column_name,$r_table_name) = $cursor1->fetchrow_array) {
  2752.             push @columns, $column_name;
  2753.             $table_name = $r_table_name;
  2754.          }
  2755.          $cursor1->finish;
  2756.          if ($#columns > 0) {
  2757.             $cols = join(",", @columns);
  2758.             $cols =~ s/^,//;
  2759.          } else {
  2760.             $cols = $columns[0];
  2761.          }
  2762.          $ddl .= " REFERENCES $r_owner.$table_name ($cols)";
  2763.          undef $table_name;
  2764.          if ($delete_rule eq "CASCADE") {
  2765.             $ddl .= " ON DELETE CASCADE";
  2766.          }
  2767.          if ($status =~ /ENABLE/) {
  2768.             $ddl .= " ENABLEn/nn";
  2769.          } else {
  2770.             $ddl .= " DISABLEn/nn";
  2771.          }
  2772.          print $ddl;
  2773.       }
  2774.       $cursor->finish;
  2775. # Add foreign key constraints to tables which reference this table
  2776.       $sql = "$copyright
  2777. SELECT
  2778.    TABLE_NAME,
  2779.    OWNER,
  2780.    CONSTRAINT_NAME,
  2781.    R_CONSTRAINT_NAME,
  2782.    R_OWNER,
  2783.    DELETE_RULE,
  2784.    STATUS
  2785. FROM DBA_CONSTRAINTS
  2786.    WHERE R_CONSTRAINT_NAME IN
  2787. ( SELECT 
  2788.    CONSTRAINT_NAME
  2789. FROM DBA_CONSTRAINTS
  2790.    WHERE TABLE_NAME = '$object_name'
  2791.    AND OWNER = '$schema'
  2792. )
  2793.    AND R_OWNER = '$schema'
  2794. ";
  2795.       $cursor=$dbh->prepare($sql) or print "$DBI::errstrn";
  2796.       $cursor->execute;
  2797.       while (($table_name,$owner,$constraint_name,$r_constraint_name,$r_owner,$delete_rule,$status) = $cursor->fetchrow) {
  2798.          undef @columns;
  2799.          $sql1 = "$copyright
  2800. SELECT COLUMN_NAME
  2801.    FROM DBA_CONS_COLUMNS
  2802. WHERE CONSTRAINT_NAME = '$constraint_name'
  2803. AND OWNER = '$owner'
  2804.    ORDER BY POSITION
  2805. ";
  2806.          $cursor1 = $dbh->prepare($sql1) or print "$DBI::errstrn";
  2807.          $cursor1->execute;
  2808.          while ($column_name = $cursor1->fetchrow_array) {
  2809.             push @columns, $column_name;
  2810.          }
  2811.          $cursor1->finish;
  2812.          if ($#columns > 0) {
  2813.             $cols = join(",", @columns);
  2814.             $cols =~ s/^,//;
  2815.          } else {
  2816.             $cols = $columns[0];
  2817.          }
  2818.          logit("   Constraint name: $constraint_name, table $schema.$table_name: Columns: $colsn");
  2819.          $ddl = "ALTER TABLE $owner.$table_name ADD CONSTRAINT $constraint_name FOREIGN KEY ($cols)";
  2820.          undef @columns;
  2821.          $sql1 = "$copyright
  2822. SELECT
  2823.    COLUMN_NAME
  2824. FROM DBA_CONS_COLUMNS
  2825.    WHERE CONSTRAINT_NAME = '$r_constraint_name'
  2826.    AND OWNER = '$schema'
  2827. ORDER BY POSITION
  2828. ";
  2829.          $cursor1 = $dbh->prepare($sql1) or print "$DBI::errstrn";
  2830.          $cursor1->execute;
  2831.          while (($column_name,$r_table_name) = $cursor1->fetchrow_array) {
  2832.             push @columns, $column_name;
  2833.             $table_name = $r_table_name;
  2834.          }
  2835.          $cursor1->finish;
  2836.          if ($#columns > 0) {
  2837.             $cols = join(",", @columns);
  2838.             $cols =~ s/^,//;
  2839.          } else {
  2840.             $cols = $columns[0];
  2841.          }
  2842.          logit("   Constraint name: $constraint_name, table $schema.$table_name: Columns: $colsn");
  2843.          $ddl .= " REFERENCES $schema.$object_name ($cols)";
  2844.          undef $table_name;
  2845.          if ($delete_rule eq "CASCADE") {
  2846.             $ddl .= " ON DELETE CASCADE";
  2847.          }
  2848.          if ($status =~ /ENABLE/) {
  2849.             $ddl .= " ENABLEn/nn";
  2850.          } else {
  2851.             $ddl .= " DISABLEn/nn";
  2852.          }
  2853.          print $ddl;
  2854.       }
  2855.       $cursor->finish;
  2856. # Add table comments
  2857.       $sql = "$copyright
  2858. SELECT
  2859.    COMMENTS
  2860. FROM DBA_TAB_COMMENTS
  2861.    WHERE TABLE_NAME = '$object_name'
  2862.    AND OWNER = '$schema'
  2863.    AND COMMENTS IS NOT NULL
  2864. ";
  2865.       $cursor = $dbh->prepare($sql);
  2866.       $cursor->execute;
  2867.       while ($comments = $cursor->fetchrow_array) {
  2868.          print "COMMENT ON TABLE $schema.$object_name IS '$comments';n";
  2869.       }
  2870.       $cursor->finish;
  2871. # Add column comments
  2872.       $sql = "$copyright
  2873. SELECT
  2874.    COLUMN_NAME,
  2875.    COMMENTS
  2876. FROM DBA_COL_COMMENTS
  2877.    WHERE TABLE_NAME = '$object_name'
  2878.    AND OWNER = '$schema'
  2879.    AND COMMENTS IS NOT NULL
  2880. ";
  2881.       $cursor = $dbh->prepare($sql);
  2882.       $cursor->execute;
  2883.       while (($column_name,$comments) = $cursor->fetchrow_array) {
  2884.          print "COMMENT ON COLUMN $schema.$object_name.$column_name IS '$comments';n";
  2885.       }
  2886.       $cursor->finish;
  2887. # Extract grant statements
  2888.       $sql = "$copyright
  2889. SELECT 
  2890.    PRIVILEGE,
  2891.    GRANTEE 
  2892. FROM DBA_TAB_PRIVS
  2893.    WHERE TABLE_NAME = '$object_name'
  2894.    AND OWNER = '$schema'
  2895. ";
  2896.       $cursor = $dbh->prepare($sql);
  2897.       $cursor->execute;
  2898.       while (($privilege,$grantee) = $cursor->fetchrow_array) {
  2899.          print "GRANT $privilege on $schema.$object_name to $grantee;n";
  2900.       }
  2901.       $cursor->finish;
  2902.       print "nn";
  2903.    }
  2904. # Finish the HTML
  2905. # unless the user is downloading the sql.
  2906.    unless ($headertype eq "octet") {
  2907.       print <<"EOF";
  2908.             </PRE>
  2909.           </TD>
  2910.         </TR>
  2911.      </TABLE>
  2912.     </TD>
  2913.   </TR>
  2914. </TABLE>
  2915. EOF
  2916.    }
  2917.    logit("Exit subroutine tableDDL");
  2918.    exit;
  2919. }
  2920. sub Describe {
  2921.    logit("Enter subroutine Describe");
  2922.    my ($sql,$moresql,$text,$link,$infotext); 
  2923.    my $object_name = shift;
  2924. # Get owner if one is specified
  2925.    $_ = uc($object_name);
  2926.    if (/./) {
  2927.       ($schema, $object_name) = split /./;
  2928.       $moresql = "AND OWNER = UPPER('$schema')";
  2929.    } else {
  2930.       $moresql = "AND OWNER = UPPER('$schema')";
  2931.    }
  2932.    $object_name = uc($object_name);
  2933.    $schema = uc($schema);
  2934.    $sql = "$copyright
  2935. SELECT 
  2936.    COLUMN_NAME "Column name",
  2937.    DECODE(
  2938.       NULLABLE,
  2939.          'N','Not Null',
  2940.          'Y',''
  2941.    ) "Null?",
  2942.    DATA_TYPE "Type",
  2943.    DATA_LENGTH "Data length",
  2944.    DATA_PRECISION "Precision"
  2945. FROM 
  2946.    DBA_TAB_COLUMNS
  2947. WHERE TABLE_NAME = '$object_name'
  2948.    $moresql
  2949. ORDER BY COLUMN_ID
  2950. ";
  2951.    $text = "Description of $schema.$object_name";
  2952.    $link = "";
  2953.    $infotext = "Object to be described does not exist";
  2954.    my $err = DisplayTable($sql,$text,$link,$infotext);
  2955.    print "<BR><HR WIDTH="10%"><BR>n";
  2956.    logit("Exit subroutine Describe");
  2957. }
  2958. sub objectSearch {
  2959.    logit("Enter subroutine objectSearch");
  2960.    my ($sql,$text,$link,$infotext,$moresql,$count);
  2961.    my ($obj_name,$object_type,$owner,$object_id);
  2962.    my ($object_found);
  2963. # Search for an object in the entire database
  2964. # Check for a null value
  2965.    if ($object_name eq "") {
  2966.       message("You must enter an object name!n");
  2967.       Footer();
  2968.       exit;
  2969.    } else {
  2970.       $object_name = uc($object_name);
  2971.    }
  2972. # Check to see if it is a username
  2973.    $sql = "$copyright
  2974. SELECT  
  2975.    USERNAME "Username"
  2976. FROM DBA_USERS 
  2977.    WHERE USERNAME = UPPER('$object_name')
  2978. ";
  2979.    $text = "A username matches your search.";
  2980.    $link = "$scriptname?database=$database&schema=$object_name&object_type=USERINFO";
  2981.    $infotext = "No usernames match your search keyword";
  2982.    DisplayTable($sql,$text,$link,$infotext);
  2983. # Check to see if it is a tablespace
  2984.    $sql = "$copyright
  2985. SELECT  
  2986.    TABLESPACE_NAME "Tablespace name"
  2987. FROM DBA_TABLESPACES 
  2988.    WHERE TABLESPACE_NAME = UPPER('$object_name')
  2989. ";
  2990.    $text = "A tablespace name matches your search.";
  2991.    $link = "$scriptname?database=$database&schema=$object_name&object_type=TSINFO";
  2992.    $infotext = "No tablespace names match your search keyword";
  2993.    DisplayTable($sql,$text,$link,$infotext);
  2994. # Get owner if one is specified
  2995.    $_ = $object_name;
  2996.    if (/./) {
  2997.       ($schema, $object_name) = split /./;
  2998.       $moresql = "AND OWNER = UPPER('$schema')";
  2999.    }
  3000.     $sql = "$copyright
  3001. SELECT
  3002.    OBJECT_NAME                  "Object name",
  3003.    OBJECT_TYPE                  "Object type",
  3004.    OWNER                        "Owner",
  3005.    OBJECT_ID "Object ID"
  3006. FROM DBA_OBJECTS
  3007.    WHERE OBJECT_NAME LIKE UPPER('%$object_name%')
  3008.    AND OBJECT_TYPE NOT LIKE '%PARTITION'
  3009.    $moresql
  3010. ORDER BY 1,2,3
  3011. ";
  3012.    $cursor = $dbh->prepare($sql);
  3013.    $cursor->execute;
  3014.    $object_found = $cursor->fetchrow_array;
  3015.    $cursor->finish;
  3016.    if ($object_found) {
  3017.       text("The following 'LIKE' objects were found.");
  3018.    # Print the heading
  3019.       print <<"EOF";
  3020.   <FORM METHOD=POST ACTION=$scriptname>
  3021.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  3022.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Show marked object dependencies">
  3023.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  3024.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  3025.     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="dependencies">
  3026. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  3027.   <TR>
  3028.     <TD WIDTH=100%>
  3029.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  3030.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Mark</TH>
  3031.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Object name</TH>
  3032.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Object type</T
  3033. H>
  3034.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Owner</TH>
  3035. EOF
  3036.       $cursor = $dbh->prepare($sql);
  3037.       $cursor->execute;
  3038.       while (($obj_name,$object_type,$owner,$object_id) = $cursor->fetchrow) {
  3039.          $_ = $object_type;
  3040.          s/ /+/g;
  3041. # Object ID's are sometimes not returned because of database link naming conventions...
  3042.          if ($object_id) {
  3043.             print <<"EOF";
  3044.         <TR>
  3045.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=dependency~$object_id></TD>
  3046.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$scriptname?database=$database&arg=$obj_name&object_type=$_&schema=$owner>$obj_name</A></TD>
  3047.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$object_type</TD>
  3048.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$owner</TD>
  3049.         </TR>
  3050. EOF
  3051.          }
  3052.       }
  3053.       $cursor->finish;
  3054.       print <<"EOF";
  3055.       </TABLE>
  3056.     </TD>
  3057.   </TR>
  3058.   </FORM>
  3059. </TABLE>
  3060. EOF
  3061.    } else {
  3062.       message("No objects "LIKE" $object_name were found.");
  3063.    }
  3064. # If $object_name is a number, search by object_id as well.
  3065.    $_ = $object_name;
  3066.    if ( ! /D/ ) {
  3067.       $sql = "$copyright
  3068. SELECT
  3069.    OBJECT_NAME                  "Object name",
  3070.    OBJECT_TYPE                  "Object type",
  3071.    OWNER                        "Owner"
  3072. FROM DBA_OBJECTS
  3073.    WHERE OBJECT_ID = '$object_name'
  3074. ";
  3075.       $text = "The following object was found with object_id $object_name";
  3076.       $link = "";
  3077.       $infotext = "No objects were found with object_id $object_name";
  3078.       ObjectTable($sql,$text,$infotext);
  3079.    }
  3080.    if ($count && ! $ENV{'LIMIT_SEARCH'}) {
  3081.       $sql = "$copyright
  3082. SELECT 
  3083.    A.USERNAME "User accessing",
  3084.    A.OSUSER "OS Username",
  3085.    A.PROCESS "Process ID", 
  3086.    A.PROGRAM "Program", 
  3087.    B.SID "SID",
  3088.    A.SERIAL# "Serial#",
  3089.    B.OBJECT "Object name",
  3090.    B.OWNER "Owner",
  3091.    B.TYPE "Object type"
  3092. FROM V$SESSION A, V$ACCESS B
  3093.    WHERE B.OBJECT IN
  3094. (SELECT OBJECT_NAME 
  3095.    FROM DBA_OBJECTS
  3096. WHERE OBJECT_NAME LIKE UPPER('%$object_name%') $moresql
  3097.   AND A.SID = B.SID AND A.STATUS = 'ACTIVE')
  3098. ";
  3099.       $text = "Objects currently being accessed that match your search";
  3100.       $link = "";
  3101.       $infotext = "No objects that match your search are currently being accessed";
  3102.       DisplayTable($sql,$text,$link,$infotext);
  3103.       logit("Exit subroutine objectSearch");
  3104.    }
  3105. }
  3106. sub showConstraint {
  3107.    logit("Enter subroutine showConstraint");
  3108.    my ($sql,$text,$link);
  3109. # Constraint info
  3110.    $sql = "$copyright
  3111. SELECT * FROM
  3112.    (SELECT
  3113.       TABLE_NAME "Table_name",
  3114.       CONSTRAINT_NAME "Constraint name"
  3115.     FROM DBA_CONSTRAINTS
  3116.        WHERE OWNER = '$schema'
  3117.        AND CONSTRAINT_NAME = '$object_name'),
  3118.    (SELECT 
  3119.        TABLE_NAME "Parent table",
  3120.        CONSTRAINT_NAME "Parent constraint",
  3121.        OWNER "Parent owner"
  3122.     FROM DBA_CONSTRAINTS
  3123.        WHERE CONSTRAINT_NAME = 
  3124.     (SELECT R_CONSTRAINT_NAME 
  3125.         FROM DBA_CONSTRAINTS
  3126.      WHERE CONSTRAINT_NAME = '$object_name'
  3127.         AND OWNER = '$schema'))
  3128. ";
  3129.    $text = "General info: Constraint $object_name";
  3130.    $link = "";
  3131.    DisplayTable($sql,$text,$link);
  3132.    logit("Exit subroutine showConstraint");
  3133. }
  3134. sub showView() {
  3135.    logit("Enter subroutine showView");
  3136.    my ($sql,$cursor,$status,$text,$infotext,$link,$foo);
  3137. print <<"EOF";
  3138. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  3139.   <TR>
  3140.     <TD WIDTH=100%>
  3141.       <TABLE BORDER=0 cellpadding=5 cellspacing=1>
  3142.         <TR>
  3143.           <TD BGCOLOR=$headingcolor>
  3144.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  3145.               <TR>
  3146.                 <TD ALIGN=CENTER>
  3147.                   <FORM METHOD="GET" ACTION="$scriptname">
  3148.                     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  3149.                     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  3150.                     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="TABLEROWS">
  3151.                     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  3152.                     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="$object_name">
  3153.                     <INPUT TYPE="SUBMIT" NAME="tablerows" VALUE="Display $rowdisplay rows of this view">
  3154.                 </TD>
  3155.               </TR>
  3156.               <TR>
  3157.                 <TD ALIGN=CENTER><FONT COLOR=$fontcolor SIZE=$fontsize><B><I>where</I></B></FONT></TD>
  3158.               </TR>
  3159.               <TR>
  3160.                 <TD ALIGN=CENTER>
  3161.                     <INPUT TYPE="TEXT" SIZE=30 NAME="whereclause">
  3162.                 </TD>
  3163.                   </FORM>
  3164.               </TR>
  3165.             </TABLE>
  3166.           </TD>
  3167.         </TR>
  3168.       </TABLE>
  3169.     </TD>
  3170.   </TR>
  3171. </TABLE>
  3172. EOF
  3173. showGrantButton();
  3174. # General info
  3175.    $sql = "$copyright
  3176. SELECT
  3177.    TO_CHAR(CREATED,'Month DD, YYYY - HH24:MI')          "Date created",
  3178.    TO_CHAR(LAST_DDL_TIME,'Month DD, YYYY - HH24:MI')    "Last compiled",
  3179.    STATUS                                               "Status"
  3180. FROM DBA_OBJECTS
  3181.    WHERE OBJECT_NAME = '$object_name'
  3182.    AND OBJECT_TYPE = '$object_type'
  3183.    AND OWNER = '$schema'
  3184. ";
  3185.    $text = "General info: $object_type $object_name";
  3186.    DisplayTable($sql,$text);
  3187.    checkValidity();
  3188.    $object_type = lc $object_type;
  3189. # View structure