Я создал курсор, чтобы выбрать фактические данные и перебрать их, выводя необработанное значение и значение после того, как оно было преобразовано в число.Приложение иногда выдает неверные номера ошибок.Ниже мой тестовый (не включая оператор select) код и вывод
LOOP
FETCH myCursor into v_answer;
EXIT WHEN myCursor%notfound;
DBMS_OUTPUT.PUT_LINE('Raw answer: ' || v_answer );
v_instr := INSTR(v_answer, '.',1 , 2) ;
v_number := TO_NUMBER(REPLACE(TRANSLATE (CASE v_instr
WHEN 0 THEN UPPER(v_answer)
ELSE 0
END,'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''));
DBMS_output.put_line('As number: ' || v_number);
Вот вывод:
Raw answer: 4
As number: 4
Raw answer: 3
As number: 3
Raw answer: 1.00
As number: 1
Raw answer: <3
Я получаю:
PL / SQL: ошибка числа или значения: ошибка преобразования символа в число
... когда необработанный ответ равен «<3». </p>
Обратите внимание, что фактический код, используемый приложением, выглядит следующим образом:
AND TO_NUMBER(REPLACE(TRANSLATE ( decode( INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''))
и является частью предложения where в динамической строке sql.Я заменил оператор декодирования оператором case, потому что я получал функцию, или псевдостолбец 'DECODE' может быть использован внутри ошибки только оператора SQL.
Наконец, у меня следующие вопросы:
- Почему функция перевода не заменяет знак меньше и
- В чем разница (с точки зрения непрофессионала)между ошибками ORA-1722 и ORA-06502?
РЕДАКТИРОВАТЬ: я заметил, что когда я изменяю оператор case на:
CASE v_instr
WHEN 0 THEN UPPER(v_answer)
ELSE '0'
,
Я больше не получаю ошибку 06502.Судя по исходной строке кода, которую я разместил, есть ли какие-либо предположения относительно того, что может быть причиной ошибки недопустимого числа (при условии, что в строке для перевода не существует символов, которые не учитываются)?Или есть лучший способ выполнить то, что пытался сделать первоначальный разработчик?
Вот объявления переменных:
v_answer varchar2(2000);
v_number number;
v_instr number;