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).