没有数据时避免异常

Avoid Exception when there is no data

我正在做一个项目,我有一个用 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 table 是空的。

当您使用 GROUP BYAGGREGATE 函数时,它一定会为您提供结果。如果 table 中没有数据,那么它也会给你 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>

干杯!!

只需删除 GROUP BY。没有 GROUP BY 的聚合查询总是 returns 恰好一行。列将是 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 好像是一个参数,但是和列名冲突。给它一个不同的名字!
  • 我删除了 CASE 表达式中的 ELSE '''' 无论如何都是 NULL,默认返回值是 NULL,没有 ELSE
  • 如果没有行匹配,结果将为 NULL。如果您想要不同的值,请使用 COALESCE().