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