Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

PL/SQL ORA-01422:a busca exata retorna mais do que o número de linhas solicitado


Um SELECT INTO A instrução lançará um erro se retornar algo diferente de 1 linha. Se retornar 0 linhas, você receberá um no_data_found exceção. Se retornar mais de 1 linha, você receberá um too_many_rows exceção. A menos que você saiba que sempre haverá exatamente 1 funcionário com um salário maior que 3.000, você não deseja um SELECT INTO declaração aqui.

Provavelmente, você deseja usar um cursor para iterar (potencialmente) várias linhas de dados (também estou assumindo que você pretendia fazer uma junção adequada entre as duas tabelas em vez de fazer um produto cartesiano, então estou assumindo que há é um departmentID coluna em ambas as tabelas)
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;

Estou assumindo que você está apenas aprendendo PL/SQL também. Em código real, você nunca usaria dbms_output assim e não dependeria de ninguém ver os dados que você escreve no dbms_output amortecedor.