Oracle проблема обновления с оператором AND - PullRequest
1 голос
/ 30 января 2020

У меня есть промежуточная таблица в oracle, все столбцы установлены на varchar2 для приема текстовых данных из функции импорта Excel. Как только данные массово копируются в промежуточную таблицу, я проверяю данные и отмечаю ошибки для записей, которые не прошли проверку.

Один из моих операторов проверки выдает ошибку «Неверное число». Можно ли как-то помешать oracle оценить правую сторону условия AND, если произошел сбой левой стороны?

Мой оператор обновления такой, как показано ниже, а в столбцах AMT есть текст, отличный от нумерации c data.

UPDATE StagingTable
SET ErrorTXT = Error_txt || 'Invalid Amount, '
WHERE f_isnumber (INV_AMT) > 0
AND TO_NUMBER (INV_AMT) > 9999999999.99;

Столбец INV_AMT в виде ненужных не числовых данных c. Я ожидаю, что левая сторона условия, которая оценивается как ложная, для нечисловых c данных, должна прекратить оценку правой стороны и, таким образом, ошибка Invalid Number не должна быть выдана. Есть ли подсказка, которую я могу использовать?

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вы также можете использовать выражение case. Предполагая, что функция f_isnumber() выполняет этот тест:

WHERE (CASE WHEN f_isnumber(INV_AMT) > 0 THEN TO_NUMBER(INV_AMT)
       END) > 9999999999.99;

Если нет, вы можете использовать регулярное выражение:

WHERE (CASE WHEN REGEXP_LIKE(INV_AMT, '^-?[0-9]*([.][0-9])?[0-9]*') 
            THEN TO_NUMBER(INV_AMT)
       END) > 9999999999.99;
0 голосов
/ 30 января 2020

Вы можете использовать ON CONVERSION ERROR с TO_NUMBER, если вы используете Oracle 12.2 или выше, так как вам не нужна функция f_isnumber:

UPDATE StagingTable
SET ErrorTXT = Error_txt || 'Invalid Amount, '
WHERE TO_NUMBER(INV_AMT DEFAULT -1 ON CONVERSION ERROR)  > 9999999999.99;

Приветствия !!

...