Oracle
 sql >> Database >  >> RDS >> Oracle

PL/SQL ORA-01422:il recupero esatto restituisce un numero di righe superiore a quello richiesto

Un SELECT INTO l'istruzione genererà un errore se restituisce qualcosa di diverso da 1 riga. Se restituisce 0 righe, otterrai un no_data_found eccezione. Se restituisce più di 1 riga, otterrai un too_many_rows eccezione. A meno che tu non sappia che ci sarà sempre esattamente 1 dipendente con uno stipendio superiore a 3000, non vuoi un SELECT INTO dichiarazione qui.

Molto probabilmente, si desidera utilizzare un cursore per scorrere (potenzialmente) più righe di dati (suppongo anche che si intendesse eseguire un join corretto tra le due tabelle anziché eseguire un prodotto cartesiano, quindi presumo che ci è un departmentID colonna in entrambe le tabelle)

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;

Presumo che tu stia solo imparando anche PL/SQL. Nel codice reale, non useresti mai dbms_output in questo modo e non dipenderebbe dal fatto che qualcuno veda i dati che scrivi in ​​dbms_output buffer.