programing

PL/SQL ORA-01422: 정확한 가져오기가 요청된 행 수보다 많은 행을 반환합니다.

testmans 2023. 3. 21. 21:47
반응형

PL/SQL ORA-01422: 정확한 가져오기가 요청된 행 수보다 많은 행을 반환합니다.

이 오류가 계속 발생하는데 뭐가 문제인지 알 수 없어요.

선언하다
*
1행 오류:
ORA-01422: exact fetch가 요청된 행 수보다 많은 행을 반환합니다.
ORA-06512: 회선 11

여기 제 코드가 있습니다.

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

A SELECT INTOstatement는 1행 이외의 값을 반환할 경우 오류를 발생시킵니다.0 행이 반환되는 경우,no_data_found예외.1개 이상의 행이 반환되는 경우,too_many_rows예외.3000 이상의 급여를 받는 직원이 항상 정확히 한 명 있을 것이라는 것을 알지 않는 한, 당신은 그것을 원하지 않는다.SELECT INTO여기에 기재해 주세요.

대부분의 경우 커서를 사용하여 (잠재적으로) 여러 데이터 행에 걸쳐 반복할 필요가 있습니다(또한 데카르트 제품을 사용하는 것이 아니라 두 테이블 간에 적절한 결합을 수행하려고 의도한 것으로 생각됩니다.따라서 다음과 같은 데이터가 있다고 가정합니다.departmentID두 표의 열)

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;

당신도 PL/SQL을 배우고 있을 거라고 생각합니다.실제 코드에서, 당신은 절대로dbms_output이렇게 해서 당신이 쓴 데이터를 다른 사람이 보는 것에 의존하지 않을 것입니다.dbms_output버퍼링합니다.

언급URL : https://stackoverflow.com/questions/19779483/pl-sql-ora-01422-exact-fetch-returns-more-than-requested-number-of-rows

반응형