我有一个独特的场景,其中我需要将多个列值放入多个变量中。我面临的问题是,虽然一个列值存在,但其他列不需要存在,因此我最终得到了DATA NOT FOUND异常,而我想抑制它并将空值放入剩余的变量中。
select nvl(A,''), nvl(B,''), nvl(C,'')
into A1, B1, C1
from SAMPLE_TABLE
where name ='W6';
表中A的值可以为'hello', B的值可以为null, C的值可以为null。
当语句在存储过程的主体内执行时,我不希望DATA not FOUND异常,相反,我希望A1具有值'hello', B1为"和C1为"。我将动态地运行这个,并且where条件不断变化,因此我也不想打开那些游标。谁能让我知道我怎么能做到同样的?
你的分析不太正确。你只收到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;
:
如果您想选择NULL值,即使WHERE条件不匹配行,那么您可以尝试以下查询:
SELECT t.A, t.B, t.C
FROM DUAL
LEFT JOIN SAMPLE_TABLE t ON t.name = 'W6';
Update 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;