我已经寻找了一段时间来寻找解决这个问题的方法,我发现的所有 NO_DATA_FOUND 处理教程只展示了如何在仅将一列放入一个变量的情况下进行 Select Into 操作。
首先,这是我的代码:
BEGIN
OPEN c_no_source;
LOOP
DECLARE
l_price_code VARCHAR2(20) := '';
l_price_level VARCHAR(10) := '';
l_code_date DATE := p_effective_date;
BEGIN
FETCH c_no_source INTO c_no_source_row;
exit WHEN c_no_source%NOTFOUND;
BEGIN
WITH codeList AS /* liste des dates ayant une donnée avant la date effective incluse. */
(
SELECT distinct
NVL(effective_date,p_effective_date) as effective_date,
NVL(user_group2,'') as price_code,
NVL(user_group3,'') as price_level
FROM DGA_Service.Hjvsecmaster_Hist
WHERE effective_date <= p_effective_date
AND user_group2 IS NOT NULL
AND security_alias = c_no_source_row.security_alias
ORDER BY 1 DESC
)
SELECT price_code, price_level, effective_date
INTO l_price_code, l_price_level, l_code_date
FROM codelist
WHERE ROWNUM = 1;
EXCEPTION WHEN no_data_found THEN NULL;
...
[UPDATE statement using the variables]
...
END;
END;
END LOOP;
CLOSE c_no_source;
END;
我要做的是将我的codeList
临时结果集的前 1 个结果放入三个单独的变量中。但是,其中的三列之一codeList
通常是NULL
. 我的 3 个变量都不会设置。我试图处理异常,但我无法让我的代码将具有值的列插入到它们各自的变量中。如果即使其中一列是 NULL,那么它们都不会插入到它们的变量中。
我希望 Select Into 语句设置它可以设置的变量。
我尝试使用以下方法分别处理它们:
EXCEPTION WHEN NO_DATA_FOUND THEN
BEGIN
IF price_code IS NOT NULL THEN l_price_code := price_code; END IF;
IF price_level IS NOT NULL THEN l_price_level := price_level; END IF;
IF effective_date IS NOT NULL THEN l_code_date := effective_date; END IF;
END;
但我收到以下错误消息:
ORA-06550: line 294, column 18:
PLS-00201: identifier 'PRICE_CODE' must be declared
ORA-06550: line 294, column 15:
PL/SQL: Statement ignored
ORA-06550: line 295, column 18:
PLS-00201: identifier 'PRICE_LEVEL' must be declared
ORA-06550: line 295, column 15:
PL/SQL: Statement ignored
ORA-06550: line 296, column 18:
PLS-00201: identifier 'EFFECTIVE_DATE' must be declared
ORA-06550: line 296, column 15:
PL/SQL: Statement ignored
所以我没有主意了。我尝试指定临时表名称,但无济于事,如下所示:
IF codeList.price_code IS NOT NULL
我很想在这个问题上提供任何帮助。这段代码运行的包已经很重了,我不想让每一列都有一个单独的With ... As () Select Into
子句。