Howdy:

I would like to use the table_info() method for getting
database / table metadata from a database.  In this case,
PostgreSQL 7.2.x.

I am reading the "Programming the Perl DBI" book and
I am using the following for my script to get a list of
tables and get *some* information.

[snip]
#!/usr/bin/perl -w

# script to connect to Postgres do a count
# get a list of tables info (DDL) and make
# new DDL files to move to Oracle
#
# need table owner, table name, column, type
# and pass that into a file
#
# should be cool

use strict;
use diagnostics;
use DBI;
use POSIX 'strftime';

my $datestr=strftime '%d%B%Y',localtime;
# connect to postgres via DBI
my $dbh=DBI->connect('dbi:Pg:dbname=test_db', 'joe_user')
   or die "Can not connect: $!";

our $listo=&getTable();

sub getTable() {
my $tabsth = $dbh->table_info();
while (my ($qual, $owner, $name, $type, $rem)=

# rename the name -> table for fetching
# and remembering what it's called later

   $tabsth->fetchrow_array() ) {
my $table = $name;
   open (FILE, ">$name.dll") or die "Snootch-to-the-nootch\n";
   print FILE "--Owner: $owner\n";
   print FILE "create $type $name (\n";

# statement

my $statement = "select * from $table";

# prep and execute the SQL statemetn

my $sth = $dbh->prepare ($statement);
$sth->execute();

my $fields = $sth->{NUM_OF_FIELDS};
print FILE "Number of fields: $fields\n\n";

# iterate through allthe fields and dump
# the field info

for (my $i = 0; $i <$fields; $i++) {
my $type = $sth->{TYPE}->[$i];
my $prec = $sth->{PRECISION}->[$i];
   print FILE "$name\t$type\t$prec\n";
}

   #print FILE "$owner, $name\n";
   #return $qual, $owner, $name, $type, $rem;
        }
}

print "$listo\n";

close (FILE);

$dbh->disconnect;

__END__

[/snip]


And so far, these are the results I am seeing.

[snip]

--Owner: joe
create TABLE temp_gaps (
Number of fields: 4

contract        1042
d_eff_dt        1082
gapd_eff_dt     1082
gapd_end_dt     1082

[/snip]

My question is:  is it possible to just get
the $type to reflect what it's named for (as an
example, I can only assume that '1042' is
really 'CHAR' and '1082' is DATE.  But I don't 
want to go through some 1500 tables to figure 
that out).

Reply via email to