ORA-01422: 精确提取返回的行数多于请求的行数
select first_name into initiator
from person_info;
错误信息非常清楚。您上面的SELECT语句返回多于 1 行,但是,您试图将多行提取到scalar 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.