/usr/local/CPAN/SchemaView-Plus/DBIx/SystemCatalog/Oracle.pm
package DBIx::SystemCatalog::Oracle;
use strict;
use DBI;
use DBIx::SystemCatalog;
use vars qw/$VERSION @ISA/;
$VERSION = '0.04';
@ISA = qw/DBIx::SystemCatalog/;
1;
sub schemas {
my $obj = shift;
my $d = $obj->{dbi}->selectall_arrayref("SELECT DISTINCT owner FROM (SELECT owner FROM all_tables UNION SELECT owner FROM all_views)");
return () unless defined $d and @$d;
return map { $_->[0] } @$d;
}
sub tables {
my $obj = shift;
my $d = $obj->{dbi}->selectall_arrayref("SELECT table_name FROM all_tables WHERE owner = ? UNION SELECT view_name FROM all_views WHERE owner = ?",{},$obj->{schema},$obj->{schema});
return () unless defined $d and @$d;
return map { $_->[0] } @$d;
}
sub table_type {
my $obj = shift;
my $table = shift;
my $d = $obj->{dbi}->selectall_arrayref("SELECT 1 FROM all_tables WHERE table_name = ? AND owner = ?",{},$table,$obj->{schema});
return SC_TYPE_TABLE if defined $d and @$d;
$d = $obj->{dbi}->selectall_arrayref("SELECT 1 FROM all_views WHERE view_name = ? AND owner = ?",{},$table,$obj->{schema});
return SC_TYPE_VIEW if defined $d and @$d;
return SC_TYPE_UNKNOWN;
}
sub tables_with_types {
my $obj = shift;
my $d = $obj->{dbi}->selectall_arrayref("SELECT table_name,".SC_TYPE_TABLE." FROM all_tables WHERE owner = ? UNION SELECT view_name,".SC_TYPE_VIEW." FROM all_views WHERE owner = ?",{},$obj->{schema},$obj->{schema});
return () unless defined $d and @$d;
return map { { name => $_->[0], type => $_->[1] }; } @$d;
}
sub relationships {
my $obj = shift;
my $d = $obj->{dbi}->selectall_arrayref(q!SELECT first.table_name,second.table_name,first.constraint_name,second.constraint_name FROM all_constraints first, all_constraints second WHERE first.owner = :p1 AND first.constraint_type = 'R' AND first.r_constraint_name = second.constraint_name AND second.owner = :p1!,{},$obj->{schema});
my $e = $obj->{dbi}->selectall_arrayref(q!SELECT constraint_name,table_name,column_name FROM all_cons_columns WHERE owner = ? ORDER BY constraint_name,position!,{},$obj->{schema});
my %columns = ();
if (defined $e and @$e) {
for (@$e) {
push @{$columns{$_->[0]}},
{ table => $_->[1], column => $_->[2] };
}
}
return map { { from_table => $_->[0], to_table => $_->[1],
name => $_->[2], from_columns => $columns{$_->[2]},
to_columns => $columns{$_->[3]} } } @$d if defined $d and @$d;
return ();
}
sub primary_keys {
my $obj = shift;
my $table = shift;
return () unless $table;
my $d = $obj->{dbi}->selectall_arrayref(q!SELECT all_cons_columns.column_name FROM all_constraints,all_cons_columns WHERE all_constraints.owner = ? AND all_constraints.constraint_type = 'P' AND all_constraints.table_name = ? AND all_constraints.constraint_name = all_cons_columns.constraint_name!,{},$obj->{schema},$table);
return map { $_->[0] } @$d if defined $d and @$d;
return ();
}
sub unique_indexes {
my $obj = shift;
my $table = shift;
return () unless $table;
my $d = $obj->{dbi}->selectall_arrayref(q!SELECT all_constraints.constraint_name,all_cons_columns.column_name FROM all_constraints,all_cons_columns WHERE all_constraints.owner = ? AND all_constraints.constraint_type = 'U' AND all_constraints.table_name = ? AND all_constraints.constraint_name = all_cons_columns.constraint_name!,{},$obj->{schema},$table);
if (defined $d) {
my %res = ();
for (@$d) {
push @{$res{$_->[0]}},$_->[1];
}
my @res = ();
for (keys %res) {
push @res,$res{$_};
}
return @res;
}
return ();
}
sub indexes {
my $obj = shift;
my $table = shift;
return () unless $table;
my $d = $obj->{dbi}->selectall_arrayref(q!SELECT all_indexes.index_name,all_ind_columns.column_name FROM all_indexes,all_ind_columns WHERE all_indexes.owner = ? AND all_indexes.table_name = ? AND all_indexes.index_name = all_ind_columns.index_name!,{},$obj->{schema},$table);
if (defined $d) {
my %res = ();
for (@$d) {
push @{$res{$_->[0]}},$_->[1];
}
my @res = ();
for (keys %res) {
push @res,$res{$_};
}
return @res;
}
return ();
}