【问题标题】:Avoid Exception when there is no data没有数据时避免异常
【发布时间】:2020-01-30 08:21:48
【问题描述】:

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

【问题讨论】:

  • 您可以处理 NO_DATA_FOUND 异常。例如,`BEGIN ... YOUR_CODE... EXCEPTION WHEN NO_DATA_FOUND THEN NULL;结束;

标签: sql oracle stored-procedures package procedure


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    干杯!!

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 2017-01-21
      • 2010-09-29
      • 2015-12-11
      • 2015-05-07
      • 2013-03-25
      • 2015-11-25
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多