1

複数の列の値を複数の変数に入れる必要があるというユニークなシナリオがあります。私が直面している問題は、1 つの列の値が存在している間、他の値が存在する必要がないため、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 Exception は必要ありません。代わりに、A1 の値を 'hello'、B1 を ''、C1 を '' にする必要があります。これを動的に実行し、where 条件が変化し続けるため、これらの多くのカーソルも開きたくありません。どうすれば同じことを達成できるか教えてください。

4

1 に答える 1

7

あなたの分析はまったく正しくありません。行全体が欠落している場合、つまり WHERE 条件で行が選択されていない場合にのみ、DATA NOT FOUNDエラーが発生します。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;

更新

WHERE 条件が一致する行がない場合でも NULL 値を選択する場合は、次のクエリを試すことができます。

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

更新 2: 正確に 1 行のクエリ:

このクエリは常に単一の行を返す必要があります。

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 に答える