1

再コンパイルして再インストールした後、Perl DBD::ODBC に unixODBC を使用させることができないという問題があります。以前にインストールされていました。

DBD::ODBC をコンパイルして、DataDirect ODBC Driver Manager を使用しました。unixODBC を使用するように再コンパイルしたいと思います。ただし、新しいソースから開始し、構成 (unixODBC を取得) し、コンパイルしてインストールしても、DataDirect ODBC Driver Manager を使用するとスタックするようです。Perlモジュールフォルダーからすべてのファイル(私が知っている)を削除するところまで行きましたが、再インストールしても問題は残ります。

インストール先のサーバーにインターネット接続がないため、ソースからコンパイルしているため、CPAN を使用していません。

Solaris 10でPerl 5.8.4(環境に一致)でunixODBC 1.2.3を使用しています。

見つけたものはすべて削除しました:

 1. cd /usr/perl5/site_perl/5.8.4/sun4-solaris-64int/auto/DBD/
 2. sudo rm -R ODBC
 3. cd /usr/perl5/site_perl/5.8.4/sun4-solaris-64int/DBD/
 4. sudo rm -R ODBC
 5. sudo rm ODBC.pm
 6. cd /usr/perl5/5.8.4/man/man3/
 7. sudo rm DBD::ODBC.3
 8. sudo vi /usr/perl5/5.8.4/lib/sun4-solaris-64int/perllocal.pod

次に、DBD::ODBC のエントリをすべて削除しましたperllocal.pod

実行perl Makefile.PLすると、unixODBC が検出されていることがわかります。

Looking for odbc_config at /usr/local/unixODBC_sp64/bin/odbc_config
  Found odbc_config (via /usr/local/unixODBC_sp64/bin/odbc_config) version 2.3.2

  odbc_config reports --prefix=/usr/local/unixODBC_sp64
  odbc_config reports --include-prefix=/usr/local/unixODBC_sp64/include
  odbc_config reports --lib-prefix=/usr/local/unixODBC_sp64/lib
  ODBC INC dir set to /usr/local/unixODBC_sp64/include from odbc_config
  ODBC LIB dir set to /usr/local/unixODBC_sp64/lib from odbc_config
Using ODBC HOME /usr/local/unixODBC_sp64

This looks like a unixodbc type of driver manager.
Looking for odbcinst
  odbcinst -j reports:

unixODBC 2.3.2
DRIVERS............: /usr/local/unixODBC_sp64/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/unixODBC_sp64/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/unixODBC_sp64/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/unixODBC_sp64/etc/odbc.ini

モジュールをコンパイルしてインストールする環境での ODBC に関連するすべての環境変数を次に示します。

LD_LIBRARY_PATH=/usr/local/unixODBC_sp64/lib:
LD_LIBRARY_PATH_64=/usr/local/unixODBC_sp64/lib:
PATH=/usr/local/unixODBC_sp64/bin:/usr/sfw/bin:/usr/ccs/bin:/opt/SUNWspro/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/bin
ODBCINI=/usr/local/unixODBC_sp64/etc/odbc.ini
ODBCHOME=/usr/local/unixODBC_sp64

テストを実行すると、DataDirect ドライバー マネージャーからのエラーがまだ表示されます。

DBI connect('lksdjhf','ljkshdf',...) failed: [DataDirect][ODBC lib] System information file not found. Please check the ODBCINI environment variable. (SQL-IM002) at ./test_odbcdb2.pl line 19

odbc.ini が設定されていないため、ドライバーが見つからないという事実は無視してください。unixODBC からの同じエラー メッセージを確認したいので、ジャンク接続でテストしています。

テストに使用している Perl スクリプトは次のとおりです。DataDirect ドライバー マネージャーと連携します。

#!/usr/bin/perl -w

use DBI;
use DBD::ODBC;
use DBD::DB2::Constants;

print "Enter Data Source Name:";
my $dsn =<STDIN>;
chomp $dsn;
my $data_source = "DBI:ODBC:$dsn";
print "Enter Username:";
my $user =<STDIN>;
print "Enter password:";
my $password =<STDIN>;
chomp $user;
chomp $password;

# Connect to the db2 database using odbc
my $dbh = DBI->connect($data_source, $user, $password, {AutoCommit =>1})
                or die "Can't connect to $data_source: $DBI::errstr";
$stmt = "SELECT current timestamp from sysibm.sysdummy1; ";
$sth = $dbh->prepare($stmt);
$sth->execute();

#associate variable with output columns...

$sth->bind_col(1,\$timestap);
while ($sth->fetch) {
           print "The time is: $timestap\n";
}
$dbh->disconnect;
4

1 に答える 1

3

ビルドの最後に make install を行ったかどうかは言われませんでしたが、行ったと仮定します。

これらの LD_LIBRARY_xx env vars が設定されているか、エクスポートされているかどうかは言いませんでした。

まず、他のコメントに対処します。

  1. 「DBI:ODBC:$dsn」は実際には「dbi:ODBC:$dsn」である必要があります。
  2. Perl DBI は「dbi:」の後の文字列に基づいてドライバをロードするため、「ODBC」は DBD::ODBC モジュールをロードします。
  3. 「使用する ODBC ドライバー マネージャーを選択するのは、DBD::ODBC 構成の時点です」は正しくありません。構成は、コンパイル対象のドライバー マネージャーのみを選択します。リンク時にリンカーへの「実行パス」命令が提供されるとは思いません。したがって、unixODBC に対してビルドし、実行しているように見える DD に対して実行することができます。

Perl ツリーで ODBC.so を見つけます (/home/martin/perl5/perlbrew/perls/perl-5.19.10/lib/site_perl/5.19.10/x86_64-linux/ のような DBD/ODBC というディレクトリにあるはずです)。 auto/DBD/ODBC/ODBC.so)。その上で「ldd ODBC.so」を実行し、出力で libodbc.so がどこから来ているかを確認します。

$ ldd ./blib/arch/auto/DBD/ODBC/ODBC.so
        libodbc.so.1 =>  /usr/local/lib/libodbc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libthread.so.1 =>        /usr/lib/libthread.so.1
        libc.so.1 =>     /usr/lib/libc.so.1
        /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1

ここでは、ダイナミック リンカが libodbc.so.1 への依存関係を /usr/local/lib/libodbc.so.1 で解決しています。動的リンカに、今探している場所の前に unixODBC lib ディレクトリを調べるように指示する必要があります。LD_LIBRARY_PATH の使用は機能しない可能性があります。特に、root として実行していて、動的な liker にどこを見ればよいかを伝えるグローバルな方法がある場合はなおさらです。ld.so.1 セクション 1 の man ページを読んでください。

于 2014-05-13T09:07:28.513 に答える