Thanks. Currently I'm very close to a DBI release then I hope to get a
working Oracle installation again so I can work on DBD::Oracle.

Tim.

On Fri, May 17, 2002 at 09:01:43AM -0700, Tony Payne wrote:
> Ok.  I only saw column_info in the archives: guess I didn't look long
> enough.  Let me know if y'all need any help w/ testing.
> 
> ++t
> 
> On Fri, 2002-05-17 at 05:10, Tim Bunce wrote:
> > Thanks, but Steffen Goeldner <[EMAIL PROTECTED]> has already
> > implemented all of these (see archives). The real problem is that
> > I've not got round to doing a release yet. Partly because I don't
> > have a working Oracle installation at the moment - but I'm working
> > on that.
> > 
> > Tim.
> > 
> > On Thu, May 16, 2002 at 02:31:23PM -0700, Tony Payne wrote:
> > > I needed column_info, primary_key_info and foreign_key_info for
> > > DBD::Oracle, so I put together a partial implementation.  I figured
> > > someone with more time available (and better understanding of some of
> > > the attributes) might be interested in finishing it.
> > > 
> > > Let me know if you have any problems/questions.
> > > 
> > > Note that, in column_info, for attributes I wasn't sure about, I fill in
> > > NULL.  If someone who is familiar with how those columns map to Oracle
> > > metadata wants to fill me in on the mapping, I can make the changes.
> > > 
> > > ++t
> > > 
> > > 
> > 
> > > {
> > >     package DBD::Oracle::db; 
> > >     sub column_info {
> > >         my($dbh, $catalog, $schema, $table, $column) = @_;
> > >         # XXX add qualification
> > >         # XXX add knowledge of public synonmys views etc
> > >         # The SYS/SYSTEM should probably be a decode that
> > >         # prepends 'SYSTEM ' to TABLE_TYPE.
> > >         my @args;
> > >         push @args, uc($schema) if $schema;
> > >         push @args, uc($table)  if $table;
> > >         push @args, uc($column) if $column;
> > > 
> > >         my $query = 
> > >             "select
> > >                 NULL                      as TABLE_CAT,
> > >                 atc.OWNER                 as TABLE_SCHEM,
> > >                 atc.TABLE_NAME            as TABLE_NAME,
> > >                 atc.COLUMN_NAME           as COLUMN_NAME,
> > >                 NULL                      as DATA_TYPE,
> > >                 NULL                      as TYPE_NAME,
> > >                 atc.DATA_LENGTH   as COLUMN_SIZE,
> > >                 NULL                      as BUFFER_LENGTH,
> > >                 atc.DATA_PRECISION        as DECIMAL_DIGITS,
> > >                 NULL                      as NUM_PREC_RADIX,
> > >                 DECODE(atc.NULLABLE, 'Y', 1, 'N', 0, 2)   as NULLABLE,
> > >                 acc.COMMENTS              as REMARKS,
> > >                 atc.DATA_DEFAULT  as COLUMN_DEF,
> > >                 NULL                      as SQL_DATA_TYPE,
> > >                 NULL                      as SQL_DATETIME_SUB,
> > >                 NULL                      as CHAR_OCTET_LENGTH,
> > >                 atc.COLUMN_ID             as ORDINAL_POSITION,
> > >                 DECODE(atc.NULLABLE, 'Y', 'YES', 'N', 'NO', '') as IS_NULLABLE
> > >             from ALL_TAB_COLUMNS atc, ALL_COL_COMMENTS acc
> > >             where atc.OWNER = acc.OWNER (+)
> > >             and atc.TABLE_NAME = acc.TABLE_NAME (+)
> > >             and atc.OWNER <> 'SYS' and atc.OWNER <> 'SYSTEM' " .
> > >             ($schema ? 'and atc.OWNER = ? '          : 
> > >                        'and atc.OWNER=(SELECT USER FROM DUAL)') .
> > >             ($table  ? 'and atc.TABLE_NAME  like ? ' : '') .
> > >             ($column ? 'and atc.COLUMN_NAME like ? ' : '') .
> > >             "and atc.COLUMN_NAME = acc.COLUMN_NAME (+)
> > >             order by atc.OWNER, atc.TABLE_NAME, atc.COLUMN_ID
> > >         ";
> > >         my $sth = $dbh->prepare($query) or return undef;
> > >         $sth->execute(@args) or return undef;
> > >         $sth;
> > >     }
> > > 
> > >     sub primary_key_info {
> > >         my($dbh, $catalog, $schema, $table) = @_;
> > >         # XXX add qualification
> > >         # XXX add knowledge of public synonmys views etc
> > >         # The SYS/SYSTEM should probably be a decode that
> > >         # prepends 'SYSTEM ' to TABLE_TYPE.
> > > 
> > >         my $query = 
> > >             "select
> > >                 NULL                      as TABLE_CAT,
> > >                 acc.OWNER                 as TABLE_SCHEM,
> > >                 acc.TABLE_NAME            as TABLE_NAME,
> > >                 acc.COLUMN_NAME           as COLUMN_NAME,
> > >                 acc.POSITION            as KEY_SEQ,
> > >                 acc.CONSTRAINT_NAME     as PK_NAME
> > >             from ALL_CONS_COLUMNS acc, ALL_CONSTRAINTS ac
> > >             where ac.constraint_name = acc.constraint_name
> > >                 and ac.owner = acc.owner
> > >                 and ac.table_name = acc.table_name
> > >                 and ac.constraint_type = 'P'
> > >                 and acc.OWNER <> 'SYS' and acc.OWNER <> 'SYSTEM' " .
> > >             ($schema ? 'and acc.OWNER = ? '          : 
> > >                        'and acc.OWNER=(SELECT USER FROM DUAL)') .
> > >             "and acc.TABLE_NAME  like ? 
> > >             order by acc.OWNER, acc.TABLE_NAME, acc.POSITION
> > >         ";
> > >         my $sth = $dbh->prepare($query) or return undef;
> > >         $sth->execute(($schema ? uc($schema) : ()), uc($table)) or return undef;
> > >         $sth;
> > >     }
> > > 
> > >     sub foreign_key_info {
> > >         my($dbh, $pkt_cat, $pkt_schema, $pkt_table,
> > >                  $fkt_cat, $fkt_schema, $fkt_table) = @_;
> > >         # XXX add qualification
> > >         # XXX add knowledge of public synonmys views etc
> > >         # The SYS/SYSTEM should probably be a decode that
> > >         # prepends 'SYSTEM ' to TABLE_TYPE.
> > >         my @args = ();
> > >         my $query = 
> > >             "select
> > >                 NULL                      as PKTABLE_CAT,
> > >                 pkc.OWNER                 as PKTABLE_SCHEM,
> > >                 pkc.TABLE_NAME            as PKTABLE_NAME,
> > >                 pkacc.COLUMN_NAME         as PKCOLUMN_NAME,
> > >                 NULL                    as FKTABLE_CAT,
> > >                 fkc.OWNER               as FKTABLE_SCHEM,
> > >                 fkc.TABLE_NAME          as FKTABLE_NAME,
> > >                 fkacc.COLUMN_NAME       as FKCOLUMN_NAME,
> > >                 pkacc.POSITION          as KEY_SEQ,
> > >                 DECODE(fkc.DELETE_RULE, 
> > >                         'CASCADE', 0, 
> > >                         'RESTRICT', 1,
> > >                         'SET NULL', 2,
> > >                         'NO ACTION', 3,
> > >                         'SET DEFAULT', 4,
> > >                         5)              as UPDATE_RULE,
> > >                 DECODE(fkc.DELETE_RULE, 
> > >                         'CASCADE', 0, 
> > >                         'RESTRICT', 1,
> > >                         'SET NULL', 2,
> > >                         'NO ACTION', 3,
> > >                         'SET DEFAULT', 4,
> > >                         8)              as DELETE_RULE,
> > >                 fkc.constraint_name     as FK_NAME,
> > >                 pkc.constraint_name     as PK_NAME,
> > >                 DECODE(fkc.deferrable,
> > >                         'INITIALLY DEFERRED', 5,
> > >                         'INITIALLY IMMEDIATE', 6,
> > >                         'NOT DEFERRABLE', 7,
> > >                         9)              as DEFERRABILITY,
> > >                 DECODE(pkc.constraint_type, 
> > >                         'P', 'PRIMARY', 
> > >                         'UNIQUE')       as UNIQUE_OR_PRIMARY
> > >             from ALL_CONS_COLUMNS pkacc, ALL_CONS_COLUMNS fkacc,
> > >                  ALL_CONSTRAINTS  pkc, ALL_CONSTRAINTS fkc
> > >             where   pkacc.constraint_name = pkc.constraint_name
> > >                 and pkacc.owner = pkc.owner
> > >                 and pkacc.table_name = pkc.table_name
> > >                 and fkacc.constraint_name = fkc.constraint_name
> > >                 and fkacc.owner = fkc.owner
> > >                 and fkacc.table_name = fkc.table_name
> > >                 and pkacc.position = fkacc.position
> > >                 and pkc.constraint_name = fkc.r_constraint_name
> > >                 and pkc.owner = fkc.r_owner
> > >                 and pkc.constraint_type in ('U', 'P')
> > >                 and fkc.constraint_type = 'R' ";
> > >             if($pkt_schema) {
> > >                 $query .= "
> > >                 and pkc.owner = ? ";
> > >                 push @args, uc($pkt_schema);
> > >             } elsif (!$fkt_table) {
> > >                 $query .= "
> > >                 and pkc.owner = (SELECT user from dual) ";
> > >             }
> > >             if($fkt_schema) {
> > >                 $query .= "
> > >                 and fkc.owner = ? ";
> > >                 push @args, uc($fkt_schema);
> > >             } else {
> > >                 $query .= "
> > >                 and fkc.owner = (SELECT user from dual) ";
> > >             }
> > >             if($pkt_table) {
> > >                 $query .= "
> > >                 and pkc.table_name = ? ";
> > >                 push @args, uc($pkt_table);
> > >             }
> > >             if($fkt_table) {
> > >                 $query .= "
> > >                 and fkc.table_name = ? ";
> > >                 push @args, uc($fkt_table);
> > >             }
> > >             
> > >             $query .= "
> > >             order by fkc.OWNER, fkc.TABLE_NAME, fkacc.POSITION,
> > >                      pkc.OWNER, pkc.TABLE_NAME, pkacc.POSITION";
> > >         
> > >         print STDERR "$query\n";                
> > >         my $sth = $dbh->prepare($query) or return undef;
> > >         $sth->execute(@args) or return undef;
> > >         $sth;
> > >     }
> > > }
> > > 
> 
> 

Reply via email to