У меня есть промежуточная таблица с двумя столбцами количества, созданными как типы varchar2, чтобы разрешить импорт из Excel.Позже эти поля проверяются, чтобы убедиться, что они содержат числовые данные, и суммирование значений для каждой строки должно быть больше нуля, прежде чем вносить обновления в фактическую таблицу.
У меня есть функция для проверки, содержит ли столбец какие-либо нечисловые данные, которые работают, как и ожидалось.
FUNCTION f_isnumber (pin_string IN VARCHAR2)
RETURN INT
IS
v_new_num NUMBER;
BEGIN
IF TRIM (pin_string) IS NOT NULL
THEN
v_new_num := TO_NUMBER (pin_string);
RETURN 1;
END IF;
RETURN 0;
EXCEPTION
WHEN VALUE_ERROR
THEN
RETURN 0;
END f_isnumber;
Далее я хотел бы перечислить все строки, в которых значение поля «два значения» равно нулю.Приведенный ниже запрос работает, когда я просто выбираю сумму в обоих столбцах.
WITH CTE1
AS (SELECT TO_NUMBER (PURCH_AMT) + TO_NUMBER (SELL_AMT) AS Total, ROW_ID
FROM STG_MAINTENANCE
WHERE PKG_MAINTENANCE.f_isnumber (PURCH_AMT) > 0
AND PKG_MAINTENANCE.f_isnumber (SELL_AMT) > 0)
SELECT TO_NUMBER (Total), CTE1.*
FROM CTE1
Но как только я добавляю предложение where, запрос завершается с ошибкой «ORA-01722: неверное число»
WITH CTE1
AS (SELECT TO_NUMBER (PURCH_AMT) + TO_NUMBER (SELL_AMT) AS Total, ROW_ID
FROM STG_MAINTENANCE
WHERE PKG_MAINTENANCE.f_isnumber (PURCH_AMT) > 0
AND PKG_MAINTENANCE.f_isnumber (SELL_AMT) > 0)
SELECT TO_NUMBER (Total), CTE1.*
FROM CTE1
WHERE Total = 0
Таблица содержит как действительные числа, так и пробелы и действительные десятичные числа, ноль и т. Д. Я надеялся, что внутренняя инструкция where исключит все нечисловые значения, и я получу только действительные десятичные значения, и если пользователь импортировал 0 или 0,00, но каким-то образом недопустимое числопоявляется ошибка.
Пример данных:
Create table STG_MAINTENANCE (ROW_ID INT, PURCH_AMT VARCHAR2(500), SELL_AMT VARCHAR2(500));
INSERT INTO STG_MAINTENANCE values(1, 'A','4.5');
INSERT INTO STG_MAINTENANCE values(2, '0','0.0');
INSERT INTO STG_MAINTENANCE values(3, '5.5','4.5');
INSERT INTO STG_MAINTENANCE values(4, '','4.5');
INSERT INTO STG_MAINTENANCE values(5, 'B','C');
INSERT INTO STG_MAINTENANCE values(6, '','');