oracle - pagesize - PL/SQL ORA-01422: la recuperación exacta devuelve más del número de filas solicitado
sqlplus set options (1)
Recibo continuamente este error. No puedo entender qué está mal.
DECLARAR
*
ERROR en la línea 1:
ORA-01422: la recuperación exacta devuelve más del número de filas solicitado
ORA-06512: en la línea 11
Aquí está mi código.
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;
/
Una SELECT INTO
generará un error si devuelve algo que no sea 1 fila. Si devuelve 0 filas, obtendrás una excepción no_data_found
. Si devuelve más de 1 fila, obtendrá una excepción too_many_rows
. A menos que sepa que siempre habrá exactamente 1 empleado con un salario superior a 3000, no desea una declaración SELECT INTO
aquí.
Lo más probable es que desee usar un cursor para iterar sobre (potencialmente) múltiples filas de datos (también asumo que pretendía hacer una combinación adecuada entre las dos tablas en lugar de hacer un producto cartesiano, así que supongo que hay es una columna departmentID
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 usted también está aprendiendo PL / SQL también. En código real, nunca usaría dbms_output
esta manera y no dependería de que alguien vea los datos que escribe en el búfer dbms_output
.