0

Oracle クエリから外部 C 関数を呼び出そうとしたときにこのエラーが発生したことはありますか? Oracle 10g を使用していますが、ライブラリ内の 2 つの関数のいずれかを呼び出そうとするたびに、このエラーが発生します。機能する関数はすべて自己完結型であり、OCI* 関数への呼び出しはありませんが、他の関数への呼び出しは毎回正常に戻ります。

失敗した C コードを呼び出すために使用されるストアド プロシージャは次のとおりです。

CREATE OR REPLACE PROCEDURE index_procedure(text in clob, tokens in out nocopy clob, location_needed in boolean)
as language c
name "c_index_proc"
library lexer_lib
with context
parameters
(
  context,
  text,
  tokens,
  location_needed
);

どんな助けでも大歓迎です。このエラー メッセージで私が見つけたすべてのことは、取るべき行動は次のとおりです。 Oracle カスタマー サポートに連絡してください。

編集: トークン clob で OCILobTrim (長さを 0 に切り詰めるため) を呼び出した後、libclntsh の奥深くに segfault があることがわかっているところまで絞り込みました。このプロシージャを呼び出すために使用したコードを次に示します。

declare text CLOB; tokens CLOB;
begin
dbms_lob.createtemporary(tokens, TRUE);
dbms_lob.append(tokens, 'token');
dbms_lob.createtemporary(text, TRUE);
dbms_lob.append(text, '<BODY>Test Document</BODY>');
index_procedure(text, tokens, FALSE);
dbms_output.put_line(tokens);
end;
/

この設定に問題があり、OCILobTrim の問題を引き起こしている可能性がありますか?

4

2 に答える 2

1

これはエラーの1つであるように見えます。これは、基本的に、外部プロシージャで問題が発生した可能性があることを意味します。

10.2.0.3には既知のバグがあり、それが関連しているかどうかはわかりません。

ORA-28579は、ODCITable / ANYDATASETインタフェースを使用して、「C」で実装されたパイプライン表関数からデータを選択しようとしたときに発生します。ODCITableDescribeは正常に機能しますが、ODCITableFetchはORA-28579エラーを生成します。

私は提案します:

  1. エラーが発生したときに生成されたログファイルまたはトレースファイルについては、データベースサーバーのトレースディレクトリと外部プロシージャが配置されているディレクトリを調べてください。
  2. 外部プロシージャを何らかの方法でインストルメント化して、その実行を自分でトレースできるようにします。
  3. Oracleサポートに連絡する
于 2009-01-09T21:33:02.833 に答える
1

10.2.0.4 (10.2.0.1 を使用していた) へのアップグレードでは、少なくとも、かなり役に立たないコア ファイルと ORA-28579 の代わりに、わかりやすいエラーが表示されました。

私がデバッグしていたコードは、OCILobRead を呼び出すと 1 回のパスですべてのデータが返されると想定していたことがわかりました。これは、固定幅文字セットを使用するすべてのクライアントに当てはまります。

可変幅キャラクタ・セットを使用するクライアントの場合、これは当てはまりません。OCILobRead は実際にはデータの一部を読み取って OCI_NEED_DATA を返し、OCILobRead への保留中の呼び出しが原因で、OCILobTrim および OCILobWrite への将来の呼び出しは失敗していました。解決策は、OCI_NEED_DATA が返されなくなり、バッファに必要なデータがすべて揃うまで、OCILobRead 呼び出しをループすることでした。

OCIBreak を呼び出すと、OCILobTrim 関数と OCILobWrite 関数を続行することもできますが、必要な入力データがすべて得られるわけではありません。

于 2009-01-15T19:54:49.063 に答える