it-swarm.com.de

PL / SQL ORA-01422: Der exakte Abruf gibt mehr als die angeforderte Anzahl von Zeilen zurück

Ich bekomme immer wieder diesen Fehler. Ich kann nicht herausfinden, was falsch ist.

ERKLÄREN
*
FEHLER in Zeile 1:
ORA-01422: Exakter Abruf gibt mehr als die angeforderte Anzahl von Zeilen zurück
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;
/
18
Hiram

Eine SELECT INTO - Anweisung löst einen Fehler aus, wenn sie etwas anderes als eine Zeile zurückgibt. Wenn es 0 Zeilen zurückgibt, erhalten Sie eine no_data_found - Ausnahme. Wenn es mehr als eine Zeile zurückgibt, erhalten Sie eine too_many_rows - Ausnahme. Sofern Sie nicht wissen, dass es immer genau 1 Mitarbeiter mit einem Gehalt von mehr als 3000 gibt, möchten Sie hier keine SELECT INTO - Erklärung.

Höchstwahrscheinlich möchten Sie einen Cursor verwenden, um (möglicherweise) mehrere Datenzeilen zu durchlaufen (ich gehe auch davon aus, dass Sie beabsichtigen, eine ordnungsgemäße Verknüpfung zwischen den beiden Tabellen vorzunehmen, anstatt ein kartesisches Produkt zu erstellen, also gehe ich davon aus, dass dies der Fall ist ist eine departmentID Spalte in beiden Tabellen)

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 gerade auch PL/SQL lernen. In echtem Code würden Sie niemals dbms_output Wie folgt verwenden und wären nicht davon abhängig, dass jemand Daten sieht, die Sie in den dbms_output - Puffer schreiben.

34
Justin Cave