4

Perlを使用してSybaseデータベースのテーブルのインデックスのリストを取得するにはどうすればよいですか?目標は、テーブルからほぼ同一のテーブルにすべてのインデックスを「コピー」することです。

$dbh->selectarray_ref('sp_helpindex $table')にできる最善のことはありますか?

4

2 に答える 2

2

DBI には statistics_info() メソッドがありますが、残念ながら、これが実装されている DBD は DBD::ODBC だけです。したがって、ODBC (update: または PostgreSQL!) を使用している場合は幸運です。それ以外の場合、sp_helpindex (または sysindexes テーブル) は、Sybase の場合とほぼ同じです。

これが私がSybaseに使用したものです(私自身のOOモジュールで-all_indexes引数がtrueでない限り、一意のインデックスのみを返します):

{
my $sql_t = <<EOT;
select
  sysindexes.name,
  index_col(object_name(sysindexes.id), sysindexes.indid, syscolumns.colid) col_name
from sysindexes, syscolumns
where sysindexes.id = syscolumns.id
  and syscolumns.colid <= sysindexes.keycnt
  and sysindexes.id = object_id(%s)
EOT

sub index_info {
  my ( $self, $table, $all_indexes ) = @_;

  my $dbh = $self->{DBH};
  my $sql = sprintf $sql_t, $dbh->quote($table);
  $sql .= "and sysindexes.status & 2 = 2\n" unless $all_indexes;
  my $sth = $dbh->prepare($sql);
  $sth->execute();
  my @col_names = @{$sth->{NAME_lc}};
  my %row; $sth->bind_columns(\@row{@col_names});
  my %ind;
  while ($sth->fetch()) {
    if ( $row{col_name} ) {
      push @{$ind{$row{name}}}, lc($row{col_name});
    }
  }
  return unless %ind;
  return \%ind;
}

}

または、単にインデックスをコピーすることが目的の場合は、dbschema.plユーティリティ (Sybase::DBlib を使用) を取得する必要があります。「CREATE INDEX」ステートメントが生成されます。

于 2009-01-22T22:57:57.293 に答える
0
SELECT i.*
FROM sysobjects o, sysindexes i
WHERE o.name = $name
  AND i.id = o.id
于 2009-01-22T22:36:29.160 に答える