sql >> Base de Datos >  >> RDS >> Oracle

PL/SQL ORA-01422:la búsqueda exacta devuelve más filas de las solicitadas

A SELECT INTO La declaración arrojará un error si devuelve algo que no sea 1 fila. Si devuelve 0 filas, obtendrá un no_data_found excepción. Si devuelve más de 1 fila, obtendrá un too_many_rows excepción. A menos que sepa que siempre habrá exactamente 1 empleado con un salario superior a 3000, no desea un SELECT INTO declaración aquí.

Lo más probable es que desee usar un cursor para iterar (potencialmente) varias filas de datos (también asumo que tenía la intención de hacer una unión adecuada entre las dos tablas en lugar de hacer un producto cartesiano, así que asumo que hay es un departmentID columna en ambas tablas)

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;

Supongo que también estás aprendiendo PL/SQL. En código real, nunca usarías dbms_output así y no dependería de que nadie vea los datos que escribe en el dbms_output búfer.