PL/SQL ORA-01422:精确提取返回超过请求的行数

Hir*_*ram 19 oracle plsql sqlplus oracle11g

我得到这个错误我无法弄清楚出了什么问题.

第1行的DECLARE
*
ERROR:
ORA-01422:精确提取返回超过请求的行数
ORA-06512:第11行

这是我的代码.

DECLARE
    rec_ENAME EMPLOYEE.ENAME%TYPE;
    rec_JOB EMPLOYEE.DESIGNATION%TYPE;
    rec_SAL EMPLOYEE.SALARY%TYPE;
    rec_DEP DEPARTMENT.DEPT_NAME%TYPE;
BEGIN       
    SELECT EMPLOYEE.EMPID, EMPLOYEE.ENAME, EMPLOYEE.DESIGNATION, EMPLOYEE.SALARY,  DEPARTMENT.DEPT_NAME 
    INTO rec_EMPID, rec_ENAME, rec_JOB, rec_SAL, rec_DEP 
    FROM EMPLOYEE, DEPARTMENT 
    WHERE EMPLOYEE.SALARY > 3000;

    DBMS_OUTPUT.PUT_LINE ('Employee Nnumber: ' || rec_EMPID);
    DBMS_OUTPUT.PUT_LINE ('---------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Name: ' || rec_ENAME);
    DBMS_OUTPUT.PUT_LINE ('---------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Designation: ' || rec_JOB);
    DBMS_OUTPUT.PUT_LINE ('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Salary: ' || rec_SAL);
    DBMS_OUTPUT.PUT_LINE ('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Department: ' || rec_DEP);

END;
/
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 35

如果SELECT INTO语句返回1行以外的任何内容,则会抛出错误.如果它返回0行,你将得到一个no_data_found例外.如果它返回超过1行,你将得到一个too_many_rows例外.除非您知道总会有1名员工的薪水大于3000,否则您不需要SELECT INTO在此处发表声明.

最有可能的是,你想使用游标迭代(可能)多行数据(我还假设你打算在两个表之间进行正确的连接而不是做笛卡尔积,所以我假设那里是departmentID两个表中的一列)

BEGIN
  FOR rec IN (SELECT EMPLOYEE.EMPID, 
                     EMPLOYEE.ENAME, 
                     EMPLOYEE.DESIGNATION, 
                     EMPLOYEE.SALARY,  
                     DEPARTMENT.DEPT_NAME 
                FROM EMPLOYEE, 
                     DEPARTMENT 
               WHERE employee.departmentID = department.departmentID
                 AND EMPLOYEE.SALARY > 3000)
  LOOP
    DBMS_OUTPUT.PUT_LINE ('Employee Nnumber: ' || rec.EMPID);
    DBMS_OUTPUT.PUT_LINE ('---------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Name: ' || rec.ENAME);
    DBMS_OUTPUT.PUT_LINE ('---------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Designation: ' || rec.DESIGNATION);
    DBMS_OUTPUT.PUT_LINE ('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Salary: ' || rec.SALARY);
    DBMS_OUTPUT.PUT_LINE ('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Department: ' || rec.DEPT_NAME);
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

我假设你也在学习PL/SQL.在实际代码中,您永远不会dbms_output像这样使用,并且不会依赖于任何人看到您写入dbms_output缓冲区的数据.

  • 这并不是说 DBMS_OUTPUT 不正确,而是讲师和教程作者只是绕过了它。Dbms_Output **不产生任何输出**。它创建一个客户端可以处理(读取)的缓冲区,无论该客户端是 sqlplus、IDE、java 应用程序/程序、Web 服务……同样,*客户端可以忽略它*。问题是大多数生产应用程序/服务都忽略它。它确实允许创建消息来向您展示您的流程正在做什么和值。因此它是一个有用的学习和调试工具。但在实时应用程序中用处不大。 (2认同)