ORA-01422: 正確なフェッチは、要求された数よりも多くの行を返します
select first_name into initiator
from person_info;
エラーメッセージはかなり明確です。上記のSELECTステートメントは複数の行を返しますが、複数の行をスカラー variableにフェッチしようとしています。SELECT INTO
単一の行にのみ使用できます。複数行の場合は、collectionsを使用する必要があります。
- フィルター述語を使用して単一行のみを返すか
- または、コレクションを使用して複数の行を保持します。
たとえば、SCOTT スキーマで標準の EMP テーブルを使用すると、次のようになります。
SQL> DECLARE
2 v_empno NUMBER;
3 BEGIN
4 SELECT empno INTO v_empno FROM emp;
5 END;
6 /
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4
WHERE ename = 'SCOTT'
単一の行のみを返すフィルターを追加しましょう。
SQL> DECLARE
2 v_empno NUMBER;
3 BEGIN
4 SELECT empno INTO v_empno FROM emp WHERE ename = 'SCOTT';
5 END;
6 /
PL/SQL procedure successfully completed.
REFCURSORを使用した複数行の例を見てみましょう。
例えば、
SQL> var r refcursor
SQL> begin
2 open :r for select empno from emp;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> print r
EMPNO
----------
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
14 rows selected.