Избегайте исключений, когда нет данных - PullRequest
2 голосов
/ 30 января 2020

Я работаю над проектом, и у меня есть схема базы данных, написанная в Oracle DB. У меня есть некоторые проблемы.

Я покажу вам свой существующий код ->

PACKAGE BODY pkg_customer_overview
IS
 PROCEDURE get_invest_agreement_info (
    opassport_no    OUT VARCHAR2,
    onational_id_no OUT VARCHAR2,
  BEGIN
  SELECT MAX(CASE WHEN doc_type=2 THEN doc_number ELSE '' END),
         MAX(CASE WHEN doc_type=1 THEN doc_number ELSE '' END)
         INTO opassport_no,
              onational_id_no
  FROM cusmm_cus_document
  WHERE customer_number=c.customer_number
  GROUP BY customer_number;

Теперь я хочу убедиться, что sp запущен, даже если таблица cusmm_cus_document пуста.

cusmm_cus_document

Ответы [ 2 ]

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

Просто удалите GROUP BY. Запрос агрегации без GROUP BY всегда возвращает ровно одну строку. Столбцы будут NULL:

SELECT MAX(CASE WHEN doc_type = 2 THEN doc_number END),
       MAX(CASE WHEN doc_type = 1 THEN doc_number END)
INTO opassport_no, onational_id_no
FROM cusmm_cus_document c
WHERE c.customer_number = in_customer_number;

Примечания:

  • customer_number представляется параметром, но конфликтует с именем столбца. Дайте ему другое имя!
  • Я удалил ELSE '' в выражениях CASE. В любом случае '' равно NULL, а возвращаемое значение по умолчанию - NULL без ELSE.
  • Результатом будет NULL, если не найдено ни одной строки. Если вы хотите разные значения, используйте COALESCE().
2 голосов
/ 30 января 2020

Пока вы используете функции GROUP BY и AGGREGATE, вы обязательно получите результат. Если в таблице нет данных, то это также даст вам null вывод.

См. Это:

SQL> --EMPTY TABLE
SQL> WITH YOUR_TABLE ( D ) AS (
  2      SELECT 1
  3      FROM DUAL
  4      WHERE 1 = 2 -- condition to create empty table
  5  )
  6  SELECT
  7      coalesce(max(d),-999) AS RESULT -- default value 999
  8  FROM YOUR_TABLE
  9  WHERE D = 2; -- extra condition, though not needed as table is empty.

    RESULT
----------
      -999

SQL>

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

...