2

Oracleでプロシージャを作成するコードを作成しました。作成は成功しましたが、SQL開発者からRUNして出力を表示すると、エラーが表示されます。

ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "TESTUSER.USER_FEEDBACK", line 5
ORA-06512: at line 2

コード:

create or replace PROCEDURE user_feedback
IS
initiator VARCHAR2(50);
BEGIN
select first_name into initiator
from person_info;
END ;

私に提案してください。

4

2 に答える 2

4

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.
于 2015-12-24T12:06:51.973 に答える