oracle - 为什么 Oracle SELECT INTO 语句会抛出错误?

标签 oracle plsql select-into ora-01422

我编写了一个在oracle中创建过程的代码,它已成功创建,但是当从sql开发人员运行以查看输出时,它显示错误。

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 ;

请推荐我。

最佳答案

ORA-01422: exact fetch returns more than requested number of rows

select first_name into initiator
from person_info;

错误信息非常清楚。上面的 SELECT 语句返回多于 1 行,但是,您正尝试将多行提取到标量变量中。您只能对单行使用SELECT INTO。对于多行,您需要使用集合

  • 使用过滤谓词仅返回单行
  • 或者,使用集合来保存多行。

例如,在 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.

关于oracle - 为什么 Oracle SELECT INTO 语句会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34452493/

相关文章:

sql - Oracle PLSQL 按状态或范围分组检查

sql - 错误: "coalesce" is not a known variable in INTO clause

c - 终止长时间运行的进程

sql - 相当于 Oracle XE 11.2 中 PostgreSQL 的 array_agg

sql - oracle next_day函数使用天数

sql - 选择多个列到多个变量中

mysql - 过程中出现错误 1064

java - 如何在hibernate中使用作为另一个表的复合主键的外键的一部分作为主键?

java - 从 Java 使用表类型参数调用 OracleDB 过程——DB 总是接收空值而不是值

oracle - 在 Oracle 中使用多个可能的掩码转换为日期