2013-11-04 4 views
14

Ich bekomme immer wieder diesen Fehler Ich kann nicht herausfinden, was falsch ist.PL/SQL ORA-01422: exakter Abruf liefert mehr als angeforderte Anzahl von Zeilen

DECLARE
*
FEHLER in Zeile 1:
ORA-01422: genaue Rückkehr holen mehr als die angeforderte Anzahl von Zeilen
ORA-06512: in Zeile 11

Hier ist mein Code.

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

Antwort

26

A SELECT INTO Aussage wirft einen Fehler, wenn sie etwas anderes als 1 Zeile zurückgibt. Wenn es 0 Zeilen zurückgibt, erhalten Sie eine no_data_found Ausnahme. Wenn es mehr als 1 Zeile zurückgibt, erhalten Sie eine too_many_rows Ausnahme. Wenn Sie nicht wissen, dass es immer genau 1 Mitarbeiter mit einem Gehalt über 3000 gibt, wollen Sie hier keine SELECT INTO Erklärung.

Wahrscheinlich möchten Sie einen Cursor verwenden, um über (möglicherweise) mehrere Datenzeilen zu iterieren (ich gehe auch davon aus, dass Sie eine richtige Verknüpfung zwischen den beiden Tabellen vornehmen wollten, anstatt ein kartesisches Produkt zu erstellen). unter der Annahme, dass eine m departmentID Spalte in beiden Tabellen vorhanden) ist

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; 

ich gehe davon aus, dass Sie auch nur zu lernen, PL/SQL werden. In echtem Code würden Sie niemals dbms_output so verwenden und wären nicht darauf angewiesen, dass jemand Daten sieht, die Sie in den Puffer dbms_output schreiben.

+0

Danke, aber ich musste alle diese "DBMS_OUTPUT" Zeilen behalten und dann "SET SERVEROUTPUT ON" verwenden, um die Ergebnisse anzuzeigen. Was wäre der richtige Weg? Das Buch, von dem ich lerne, lehrt mich, es so zu machen. Es gibt eine Spalte departmentID in beiden Tabellen, aber ich brauchte die departmentName, die nur in der Abteilungs-Tabelle war. Ja, ich bin neu in PL/SQL, und ich lerne es als Teil meiner Datenbank-Programmierklasse für meinen Bachelor-Abschluss in Informationssystemen. – Hiram

Verwandte Themen