run pagesize desde conectarse comandos 11g oracle plsql oracle11g sqlplus

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 .