Принудительная ошибка Oracle при получении - PullRequest
2 голосов
/ 14 мая 2010

Я пытаюсь отладить странное поведение в моем приложении. Для этого мне нужно воспроизвести сценарий, в котором запрос 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: invalid number на самом шаге выполнения.

Я получил это поведение программно, используя ADO (с серверным курсором) и JDBC, а также от PL / SQL Developer. Как я могу получить результат, который я ищу? спасибо

Редактировать - значит добавить, что при использовании ADO я звоню только Command.Execute. Я не создаю и не открываю набор записей.

Ответы [ 2 ]

3 голосов
/ 15 мая 2010

Это может быть выбор очень большой партии (например, 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);
3 голосов
/ 14 мая 2010

Этот анонимный блок 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;
* ** 1003 1004 * Выход:
Called 1
Called 2
Error at line 2
ORA-01722: invalid number
ORA-06512: at line 2
...