没有数据时避免异常

问题描述 投票:0回答:2

我正在一个项目上,并且我有一个用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;

现在,即使cusmm_cus_document表为空,我也要确保运行sp。

cusmm_cus_document

sql oracle stored-procedures package procedure
2个回答
1
投票

虽然您正在使用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>

干杯!


0
投票

只需删除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()
© www.soinside.com 2019 - 2024. All rights reserved.