1

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

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

表中A的值可以是'hello',表中B的值为空,C的值为空。
当语句在存储过程的主体内执行时,我不希望出现 DATA NOT FOUND 异常,而是希望 A1 的值为“hello”,B1 为“”,C1 为“”。我将动态运行它并且 where 条件不断变化,因此我也不想打开那些游标。谁能让我知道我怎么能做到这一点?

4

1 回答 1

7

你的分析不太正确。如果整行丢失,您只会收到DATA NOT FOUNDname ='W6'错误,即 WHERE 条件不选择任何行。

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

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;

更新

如果即使 WHERE 条件不匹配任何行,您也想选择 NULL 值,那么您可以尝试以下查询:

SELECT t.A, t.B, t.C
FROM DUAL
LEFT JOIN SAMPLE_TABLE t ON t.name = 'W6';

更新 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;
于 2012-12-30T12:52:51.077 回答