2013-11-04 2 views
14

このエラーが発生する何が問題なのかわかりません。 1行目でPL/SQL ORA-01422:要求された行数よりも正確なフェッチが返されます

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; 
/

答えて

26

SELECT INTOステートメントは1行以外のものを返すとエラーになります。 0行が返された場合は、no_data_found例外が発生します。 2行以上を返した場合は、too_many_rowsの例外が発生します。給与が3000を超える従業員が常に1人いることが分かっている場合を除き、ここにSELECT INTOの声明は必要ありません。

ほとんどの場合、カーソルを使用して複数の行のデータを繰り返し処理する必要があります(デカルト積を行うのではなく、2つのテーブルの間で適切な結合を行うことを前提としています) mが、私はあなただけのようにもPL/SQLを学習していることを仮定してい

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; 

)両方のテーブルのdepartmentID列があると仮定します。実際のコードでは、このようなdbms_outputを使用することは決してなく、dbms_outputバッファに書き込むデータを見る人には依存しません。

+0

ありがとうございましたが、これらの "DBMS_OUTPUT"行をすべて残してから、 "SERVEROUTPUT ON"を使用して結果を表示する必要がありました。正しい方法は何でしょうか?私が学んでいるこの本は私にこのようにするよう教えている。両方のテーブルにdepartmentIDカラムがありますが、私はdepartmentテーブルにしかなかったdepartmentNameが必要でした。はい、PL/SQLの初心者です。情報システム専攻の学部のデータベースプログラミングクラスの一部として学習しています。 – Hiram

関連する問題