0

INFORMIXDBでいくつかのストアドプロシージャ/関数を実行する際に問題が発生しました。私はさまざまなクライアントで試しましたが、それらはすべて同じでした-これの代わりに、実行時にエラーを検出する人は誰もいません-空の応答を返します。そして、これは私にはうまくいきません。

最後に、次のようなPERL DBI設定オプションがあることがわかりました。RaiseError

{  PrintError => 0, RaiseError => 1 }

そして、これは完璧に機能します。unixODBC C APIしかし、 libに相当するものはありますか(残念ながら、何も見つかりませんでした) ?


さらに:私はと同じクエリを試しましたがisql、同じです!エラーはありません。結果は空です:\おそらく、構成する必要のあるオプションである可能性があります(でodbc.ini、私は推測します)?


編集:わかりました、ここにいくつかの詳細があります:
バージョン:unixODBC 2.3.0

CREATE FUNCTION "test".NOK_func_k() RETURNING LVARCHAR(1000);
set debug file to '/home/directory_does_not_exists/unknown.log';
trace off;
trace on;
trace off;
return 'result is set here';
END FUNCTION;

CREATE PROCEDURE "test".NOK_proc_k(pDummy SMALLINT)
set debug file to '/home/directory_does_not_exists/unknown.log';
trace off;
trace on;
LET pDummy = 2;
trace off;
END PROCEDURE;

そして、とからの結果isqlODBC C API同じです。ここに詳細がありC APIます:

Executing: execute procedure NOK_proc_k(1)
retcode = SQL_ERROR     SQL_SUCCEEDED( retcode ) = 0
--------------------------------------------------
Executing: execute function NOK_func_k()
retcode = SQL_SUCCESS       SQL_SUCCEEDED( retcode ) = 1
--------------------------------------------------
--------------------------------------------------
Executing: execute function NOK_proc_k(1)
retcode = SQL_ERROR     SQL_SUCCEEDED( retcode ) = 0
--------------------------------------------------
Executing: execute procedure NOK_func_k()
retcode = SQL_SUCCESS       SQL_SUCCEEDED( retcode ) = 1
--------------------------------------------------
--------------------------------------------------
Executing: call NOK_proc_k(1)
retcode = SQL_ERROR     SQL_SUCCEEDED( retcode ) = 0
--------------------------------------------------
Executing: call NOK_func_k()
retcode = SQL_SUCCESS       SQL_SUCCEEDED( retcode ) = 1

SQLMoreResults戻るためのすべての呼び出しSQL_NO_DATA、すべてSQLFetch戻るSQL_ERROR

まとめ-間違ったプロシージャへの呼び出しはすべて問題ありません-エラーが返されます。ただし、このエラーがストアド関数にある場合、エラーは検出されません。これの代わりに-EMPTY文字列が返されます。アウトチ!

SQL_SUCCESS_WITH_INFOどこにも返されません。そして、他の多くのエラーについてはこのようになっています(もちろん、すべてではありませんが、これは単なる例です)


そしてさらに!次のような手順または機能:

CREATE PROCEDURE "test".nok_proc_k_2() RETURNING LVARCHAR(1000);
DEFINE vNotDefined VARCHAR(10);
LET vNotDefined = current;
END PROCEDURE;

Aqua DB studioはエラーを返しますが、エラーは返しません。

Converted value does not fit into the allotted space

答え:

私はボヒカの答えを受け入れます。それは正しく、そのPERL DBI部分について正しく答えているからです。また、彼は本当に私を助けてくれました(ヒットstrace)。

とにかく、本当の解決策はここにはありません。関連する質問に投稿しました。これは、特定のケースについてより具体的で分離されています。同じエラーがストアド**プロシージャ**で検出されますが、ストアド**関数**では検出されません。

4

1 に答える 1

2

PerlのRaiseErrorが行うことは、DBD :: ODBCなどのDBDがエラーを検出すると、DBIが登録済みのエラーハンドラーを呼び出し、そのエラーでdieを呼び出すことだけです(エラーハンドラーが何を返したかによって異なります)。set_errメソッドを介してエラーをDBIに通知するのは、依然としてDBDの責任です。

あなたのPerlはDBD::ODBCを使用していたと思います。DBD :: ODBCは、呼び出すすべてのODBC APIの戻りステータスをチェックするだけで、SQL_SUCCESS_WITH_INFOの場合は、警告であると言ってDBIのset_errを呼び出し、!SQL_SUCCEEDEDの場合は、エラーがあると言ってset_errを呼び出します(常にエラーであるとは限らないSQL_NO_DATA)。

あなたのPerlがあなたが期待しているエラーで死ぬと言っているが、あなたのCコードはそうではないなら、あなたはODBC APIリターンをチェックしてはいけません、あるいはおそらく(あなたがプロシージャに言及しているので)あなたはSQLExecuteの後にループでSQLMoreResultsを呼び出すことを保証していませんプロシージャを呼び出すSQL。一部のデータベースは、プロシージャ内の各挿入/選択/更新を一度に1つずつ実行し、ODBCではSQLMoreResultsを呼び出して各データベースを移動する必要があることに注意してください。そうしないと、手順が完了していないため、エラーが発生していない可能性があります。

于 2011-07-13T13:38:51.187 に答える