ORACLEインタフェースでのエラー

[OS]HP-UX, SunOS, AIX
[リリース] 6.09
[キーワード] access, oracle, error, free, chain, overlap, detected, generic, criticalerror, bug, pipe, driver, version, 7.0.15, later, patch, tcp/ip, sql*netservices, file, oraserv, server, path, two_task, fix, 7.1.4


[質問]

SAS/ACCESS Interface to ORACLEのパススルー機能を使用して、ORACLEのテーブルを読み込もうとしたところ、エラーとなります。
どのように対処すればよいのでしょうか。

[回答]

SAS/ACCESS Interface to ORACLEは、ORACLEと通信するときにORACLEのtwo-taskドライバを使用します。
また、ORACLEのサーバとSASが同一のマシンにインストールされている場合は、ORACLEのPIPEドライバが標準で使用されます。
このとき、ORACLEのバージョンが7.0.15以降の場合にエラーが発生することがあります。

このエラーは、ORACLEのメモリに関する処理の問題に起因します。
ORACLEのバージョンが7.0.16または7.1.3である場合はORACLEのパッチが用意されておりますので、購入先にご相談ください。
パッチ番号等の詳細につきましては、弊社テクニカルサポートセンターまでお問い合わせください。

また、この問題はSAS/ACCESSでORACLEにアクセスする際に、TCP/IPドライバを使用するように設定することでも回避可能です(ただし、TCP/IPドライバは、SQL*Netが導入されていない環境では使用できませんので、ご注意ください)。
その場合は、以下のように設定します(ここでの例は SQL*Net V1 の場合です。V2ではエリアス名を「path=」で指定できます)。

  1. /etc/servicesファイルにoraservの設定を追加します。
           oraserv     1525/tcp
           
  2. tcpctlコマンドでサーバを起動します(DBAのユーザIDで行います)。
           %tcpctl start
           (tcpctl: server has been started のメッセージが出力されます)
           
  3. アクセス時にPATHを設定します。
           sqlplusの場合: sqlplus scott/tiger@t:ホスト名:SID
           SASの場合    : path="@t:ホスト名:SID"
           
  4. デフォルトのドライバをTCP/IPに設定する場合は、環境変数TWO_TASKをセットします(3の処理は不要です)。
           %setenv TWO_TASK t:ホスト名:SID
           
なお、この問題はORACLEのバージョン7.1.4では、解決されています。