Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL ORA-01422:exact fetch返回的行数超过请求的行数_Oracle_Plsql_Oracle11g_Sqlplus - Fatal编程技术网

Oracle PL/SQL ORA-01422:exact fetch返回的行数超过请求的行数

Oracle PL/SQL ORA-01422:exact fetch返回的行数超过请求的行数,oracle,plsql,oracle11g,sqlplus,Oracle,Plsql,Oracle11g,Sqlplus,我不断地犯这个错误,我不知道是什么错了 声明 * 第1行出错: 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

我不断地犯这个错误,我不知道是什么错了

声明
*
第1行出错:
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;
/

如果
SELECT INTO
语句返回除1行以外的任何内容,则将抛出错误。如果它返回0行,您将得到
no\u data\u found
异常。如果它返回的行数超过1行,则会出现
太多行
异常。除非您知道总有一名员工的工资高于3000英镑,否则您不希望在此处出现
SELECT-INTO
语句

最有可能的情况是,您希望使用光标(可能)在多行数据上进行迭代(我还假设您打算在两个表之间进行适当的连接,而不是进行笛卡尔乘积,因此我假设两个表中都有
departmentID
列)


我假设您也在学习PL/SQL。在实际代码中,您永远不会像这样使用
dbms\u输出
,也不会依赖任何人看到您写入
dbms\u输出
缓冲区的数据。

这也可能是由于所使用的任何表中存在重复项。

谢谢,但我必须保留所有这些“dbms\u输出”行,然后使用“设置服务器输出”以显示结果。正确的方法是什么?我正在学习的那本书正在教我这样做。两个表中都有departmentID列,但我需要departmentName,它只在department表中。是的,我是PL/SQL新手,我是在信息系统专业本科的数据库编程课上学习PL/SQL的。这并不是说DBMS_的输出不正确,而是导师和教程编写者只是在绕开。Dbms_输出不产生任何输出。它创建了一个缓冲区,客户机可以处理(读取)该缓冲区,无论该客户机是sqlplus、IDE、java应用程序/程序、web服务等等。。。同样,客户机也可以忽略它。问题是大多数生产应用程序/服务只是忽略了它。它确实允许创建消息来向您显示您的流程正在做什么,以及您的价值观。因此,它是一个有用的学习和调试工具。但在实时应用程序中没有太多用途。有关更多信息,请参阅文档和/或搜索dbms_output.get_line。很高兴您愿意提供帮助,但您的回答非常简短,没有添加任何尚未说明的内容。下次请仔细阅读已有的答案。
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;