2009-08-28 15 views
7

簡単な手順を記述します。選択結果を変数に格納しようとします。私は "SELECT INTO"クエリを使用しますが、私はこれを行うことはできません。選択結果をOracleプロシージャの変数に格納する方法

例:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

シンプルな例とメッセージエラーはありますか? –

+0

私は1つの行だけを保存できますが、私の選択結果には多くの行が含まれています。 –

答えて

11

あなたはカップルのオプションがあります。

DECLARE 
    CURSOR v_employeeRecords IS 
      SELECT * FROM Employee WHERE Salary > 10; 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
    FOR v_employeeRecord IN v_employeeRecords LOOP 
      /* Do something with v_employeeRecord */ 
    END LOOP; 
END; 

をそれとも、あなたはTABLE変数を作成することができます:あなたは、カーソルにそのクエリを回すことができる

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
    v_employeeRecords IS TABLE OF employee%ROWTYPE; 
    i BINARY_INTEGER; 
BEGIN 
SELECT * BULK COLLECT INTO v_employeeRecords 
     FROM Employee WHERE Salary > 10; 

i := v_employeeRecords.FIRST; 
WHILE v_employeeRecords.EXISTS(i) LOOP 
    v_employeeRecord := v_employeeRecords(i); 
    /* Do something with v_employeeRecord */ 
    i := v_employeeRecords.NEXT(i); 
END; 
END; 

私はOracleでこれらのサンプルを試していないので、あなたは、コンパイルエラーを得ることができます。..

+0

カーソルが私の問題を解決します。 –

+2

あなたは "BULK COLLECT INTO"を使用する必要があります – jva

+0

@jva:キャッチをありがとう! –

7

SELECTで複数の行が返された場合、SELECT INTOシンタックスを使用することはできません。

あなたはresulteセットをナビゲートするためにループを構築する必要があります。

Adamは、明示的なカーソルを使用する方法を実証したとバルクがループを集めます。可能な限りシンプルなループを作成する方法を示します(暗黙のカーソルで、DECLAREセクションは必要ありません)。

BEGIN 
    FOR c_emp IN (SELECT * 
        FROM Employee 
        WHERE Salary > 10) LOOP 
     /* do something with each row, for example:*/ 
     UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id; 
    END LOOP; 
END; 
+0

良い例、ありがとう –

関連する問題