2013-11-04 29 views
14

我得到不斷得到這個錯誤我找不出什麼是錯誤的。PL/SQL ORA-01422:精確提取返回的請求數超過要求的行數

DECLARE
*在1號線
錯誤:
ORA-01422:精確獲取回報超過行的請求數量
ORA-06512:在line 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; 
/

回答

26

如果返回超過1行以外的任何SELECT INTO語句將拋出一個錯誤。如果它返回0行,你會得到一個異常。如果它返回多於一行,則會得到一個too_many_rows異常。除非您知道總是會有一名員工的薪水高於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; 

我假設你剛開始學習PL/SQL爲好。在真實代碼中,您絕對不會使用dbms_output這樣的內容,也不會依賴任何人看到您寫入dbms_output緩衝區的數據。

+0

謝謝,但我必須保留所有這些「DBMS_OUTPUT」行,然後使用「SET SERVEROUTPUT ON」來顯示結果。正確的方法是什麼?我正在學習的這本書教會我這樣做。這兩個表中都有一個departmentID列,但我需要只在部門表中的departmentName。是的,我是PL/SQL新手,我正在學習它作爲我的信息系統本科專業的數據庫編程課程的一部分。 – Hiram

相關問題