2

我正在尝试在我的应用程序中调试一个奇怪的行为。为此,我需要重现 SQL SELECT 查询将引发错误的场景,但仅在实际从游标中获取时,而不是在执行查询本身时。这可以做到吗?任何错误都可以,但ORA-01722: invalid number似乎是显而易见的尝试。

我创建了一个表格,如下所示:

KEYCOL INTEGER PRIMARY KEY
OTHERCOL VARCHAR2(100)

然后,我创建了几百行,其中主键的唯一值lothercol. 然后我运行了一个 SELECT * 查询,在中间某处选择了一行,并将其更新为 string abcd。我运行了查询SELECT KEYCOL, TO_NUMBER(OTHERCOL) FROM SOMETABLE,希望能得到一些好的数据行,然后是一个错误。但我一直ORA-01722: invalid number在执行步骤本身。

我已经使用 ADO(带有服务器端游标)和 JDBC 以及 PL/SQL Developer 以编程方式获得了这种行为。我怎样才能得到我正在寻找的结果?谢谢

编辑 - 意在添加,使用 ADO 时,我只调用Command.Execute. 我没有创建或打开记录集。

4

2 回答 2

3

这个匿名的 pl/SQL 块在游标的第三次迭代中重现了错误:

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 回答