代码之家  ›  专栏  ›  技术社区  ›  Dan

提取时强制Oracle错误

  •  2
  • Dan  · 技术社区  · 16 年前

    我正在尝试调试应用程序中的一个奇怪行为。为了做到这一点,我需要重现一个场景,其中一个SQL select查询将抛出一个错误,但只有在实际从光标获取时, 执行查询本身时。能做到吗?任何错误都可以,但是 ORA-01722: invalid number 似乎是显而易见的尝试。

    我创建了一个包含以下内容的表:

    KEYCOL INTEGER PRIMARY KEY
    OTHERCOL VARCHAR2(100)
    

    然后,我为主键和值创建了数百行,其中包含唯一的值 l 对于 othercol . 然后我运行了一个select*查询,在中间的某个位置选择了一行,并将其更新为字符串 abcd . 我运行了查询 SELECT KEYCOL, TO_NUMBER(OTHERCOL) FROM SOMETABLE 希望得到一些好的数据行,然后出错。但我一直在 ORA-01722:无效号码 在执行步骤本身上。

    我已经使用ADO(带有服务器端光标)和JDBC以及PL/SQL开发人员以编程方式获得了这种行为。我要找的结果如何?谢谢

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Gary Myers    16 年前

    可能是它选择了一个非常大的批次(例如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);
    
        2
  •  3
  •   Brian    16 年前

    这个匿名的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
    
    推荐文章