抑制oracle数据未找到异常

san*_*ndy 1 oracle plsql stored-procedures

我有一个独特的场景,我需要将多个列值放入多个变量中.我面临的问题是,虽然存在一个列值,但其他列不需要存在,因此我最终得到DATA NOT FOUND异常,而我想要抑制它并将空值放入剩余的变量中.

 select nvl(A,''), nvl(B,''), nvl(C,'') 
   into A1, B1, C1  
   from SAMPLE_TABLE 
  where name ='W6';
Run Code Online (Sandbox Code Playgroud)

表中的A值可以是"hello",B的值为null,表中的C值为null.
当语句在存储过程的主体内执行时,我不希望DATA NOT FOUND Exception,而是我希望A1的值为'hello',B1为'',C1为''.我将动态地运行它并且where条件不断变化,因此我也不想打开那些多个游标.任何人都可以让我知道我怎么能做到这一点?

Cod*_*odo 7

你的分析不太正确.如果缺少整行,则只接收DATA NOT FOUND错误,即WHERE条件name ='W6'不选择任何行.

为避免错误,您可以使用异常处理:

BEGIN
    select A, B, C 
    into A1, B1, C1  
    from SAMPLE_TABLE where name ='W6';

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        A1 := 'hello';
        B1 := NULL;
        C1 := NULL;
END;
Run Code Online (Sandbox Code Playgroud)

更新:

如果要在WHERE条件与no row匹配时选择NULL值,则可以尝试以下查询:

SELECT t.A, t.B, t.C
FROM DUAL
LEFT JOIN SAMPLE_TABLE t ON t.name = 'W6';
Run Code Online (Sandbox Code Playgroud)

更新2:只用一行查询:

此查询应始终返回单行:

SELECT A, B, C
  INTO A1, B1, C1
FROM (
   SELECT t.A, t.B, t.C
   FROM DUAL
   LEFT JOIN SAMPLE_TABLE t ON t.name = 'W6'
) x
WHERE ROWNUM <= 1;
Run Code Online (Sandbox Code Playgroud)