Oracle 11 PL/SQL:检查变量是不是为空、空字符串和无结果

Posted

技术标签:

【中文标题】Oracle 11 PL/SQL:检查变量是不是为空、空字符串和无结果【英文标题】:Oracle 11 PL/SQL: check variable for null, empty string and no resultOracle 11 PL/SQL:检查变量是否为空、空字符串和无结果 【发布时间】:2019-07-30 10:10:16 【问题描述】:

使用 PL/SQL,我执行 SELECT INTO 语句,根据结果我想执行相同的逻辑。我想检查:

无结果(返回 0 行) 空结果(1 行返回 '') null 结果(1 行返回 null)

在我当前的解决方案中,我对案例 1 使用 NO_DATA_FOUND 异常,对案例 2+3 使用 IF 检查,但以任何一种方式调用相同的逻辑,这是我不喜欢的:

     BEGIN
        SELECT some_value
          INTO my_variable
          FROM some_table
         WHERE somecheck = 123

        IF my_variable IS NULL OR my_variable = ''
        THEN
            ##perform logic##
        END IF;
     EXCEPTION
        WHEN NO_DATA_FOUND
        THEN
            ##perform same logic as above##
     END;

能否以某种方式更好地解决这个问题,以防止我必须为我的 IF 检查和我的异常复制粘贴相同的代码?

特别是,扩展我的 IF 检查是否安全

IF SQL%ROWCOUNT = 0 THEN ...

而不是使用 NO_DATA_FOUND 异常来实现我的目标?

【问题讨论】:

【参考方案1】:

如果您聚合some_value,那么您将不会得到NO_DATA_FOUND,因此您可以省略该异常处理程序。 NULL''是一样的,所以代码可以缩短为

select max(some_value) into my_variable ...

if my_variable is null then 
   ##perform logic##
end if;

【讨论】:

Hm 通过 MAX 聚合返回 ORA-00932,数据类型不一致,返回 clob 但 - 预期 你从来没有说过这是一个 CLOB。试试select max(to_char(some_value)) into ... 他也会默默地“避免” too_many_rows - 这可能是不希望的。通用逻辑可以并且应该被提取到过程中——在这种情况下不需要聚合。 嗯,是的,@piezol;这就是 OP 最初所做的并希望避免它。否则我们不会讨论它。 @Littlefoot 不,他并没有默默地避免 too_many_rows - 如果有不止一行,他的代码会抛出异常 - 你的代码会默默地继续。【参考方案2】:

您只能将逻辑放在异常处理程序中,并在 null 上显式引发该异常:

 BEGIN
    SELECT some_value
      INTO my_variable
      FROM some_table
     WHERE somecheck = 123;

    IF my_variable IS NULL
    THEN
        RAISE no_data_found;
    END IF;
 EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        ##perform logic##
 END;

或者通过首先排除空结果来获得相同的效果:

 BEGIN
    SELECT some_value
      INTO my_variable
      FROM some_table
     WHERE somecheck = 123
       AND some_value IS NOT NULL;

 EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        ##perform logic##
 END;

并不是 null 和空字符串 ('') 是一回事,因此您无需同时测试两者。但正如您所提到的,该列实际上是一个 CLOB,您可以通过在查询中或显式 raise 之前添加对 dbms_lob.getlength(some_value) > 0 的检查来检查非空但为空的 CLOB。

第三种方法是添加一个执行逻辑的本地函数,并从原始代码中的两个位置调用它。

【讨论】:

以上是关于Oracle 11 PL/SQL:检查变量是不是为空、空字符串和无结果的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11 PL SQL 使用 Execute Immediate 为变量赋值

过程检查设置参数(PL/SQL、ORACLE)

PL/SQL Oracle 11g 记录组

将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错

从 oracle PL/SQL 查看变量的值

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素