2

アプリケーションで奇妙な動作をデバッグしようとしています。そのためには、SQL SELECTクエリがエラーをスローするシナリオを再現する必要がありますが、クエリ自体の実行中ではなく、実際にカーソルからフェッチしている間だけです。これはできますか?どんなエラーでもかまいませんが、ORA-01722: invalid number試してみるべき明らかなエラーのようです。

次のテーブルを作成しました。

KEYCOL INTEGER PRIMARY KEY
OTHERCOL VARCHAR2(100)

次に、主キーの一意の値との値を使用して数百行を作成しlましたothercol。次に、SELECT *クエリを実行し、途中のどこかで行を選択して、文字列に更新しましたabcdSELECT KEYCOL, TO_NUMBER(OTHERCOL) FROM SOMETABLE良いデータのいくつかの行を取得し、後でエラーが発生することを期待してクエリを実行しました。しかし、私ORA-01722: invalid numberは実行ステップ自体を続けています。

この動作は、ADO(サーバー側カーソルを使用)とJDBCを使用してプログラムで取得したほか、PL /SQLDeveloperからも取得しました。探している結果を得るにはどうすればよいですか?ありがとう

編集-ADOを使用する場合、私はを呼び出すだけCommand.Executeです。レコードセットを作成したり開いたりしていません。

4

2 に答える 2

3

このpl/SQLの匿名ブロックは、カーソルの3回目の反復でエラーを再現します。

BEGIN
   FOR c1_rec IN (WITH example AS
                       (SELECT '1' TEST_DATA
                          FROM DUAL
                        UNION
                        SELECT '2' TEST_DATA
                          FROM DUAL
                        UNION
                        SELECT '3A' TEST_DATA
                          FROM DUAL)
                  SELECT TO_NUMBER (TEST_DATA) TEST_NUM
                    FROM example)
   LOOP
      DBMS_OUTPUT.PUT_LINE ('Called ' || c1_rec.TEST_NUM);
   END LOOP;
END;

出力:

Called 1
Called 2
Error at line 2
ORA-01722: invalid number
ORA-06512: at line 2
于 2010-05-14T16:32:15.420 に答える
3

非常に大きなバッチ(1000など)を選択している可能性があります。更新を行ったときに、何らかの理由でその行が非常に早く取得されている可能性があります。

それが助けになるかどうかはわかりませんが、パイプライン化されたテーブル関数から選択できます。これにより、エラーを返すかどうか、いつ返すかをより正確に制御できます。

create or replace function ret_err return sys.dbms_debug_vc2coll pipelined is
begin
   for i in 1..200 loop
      pipe row ('test');
   end loop;
   raise_application_error (-20001,'Error here');
   return;
end;
/

select * from table(ret_err);
于 2010-05-15T01:44:39.353 に答える