私はこの問題の解決策をしばらく探していましたが、見つけたすべてのNO_DATA_FOUND処理チュートリアルは、1つの変数に1つの列のみを使用してSelectIntoを実行する場合の方法のみを示しています。
まず、私のコードは次のとおりです。
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つの結果を3つの別々の変数に入れることです。ただし、の3つの列の1つcodeList
は多くの場合NULL
です。そして、私の3つの変数はどれも設定されません。例外を処理しようとしましたが、値を持つ列をそれぞれの変数に挿入するコードを取得できません。列の1つでも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
句を付ける必要はありません。