Проблема с добавлением десятичных значений, хранящихся как varchar - PullRequest
0 голосов
/ 10 июня 2019

У меня есть промежуточная таблица с двумя столбцами количества, созданными как типы 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, '','');

1 Ответ

0 голосов
/ 10 июня 2019

Я думаю, что способ, которым Oracle обрабатывает ваш запрос, вызывает ошибку в вашем запросе.

Например, вы можете использовать подсказку MATERIALIZE и написать свой запрос следующим образом:

WITH CTE1 AS (
    SELECT /*+MATERIALIZE*/
        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

Вы можете узнать больше о MATERIALIZE подсказке из документов оракула. ​​

Надеюсь, что это полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...