Oracle
 sql >> Base de données >  >> RDS >> Oracle

PL/SQL ORA-01422 :la récupération exacte renvoie plus que le nombre de lignes demandé

Un SELECT INTO L'instruction génère une erreur si elle renvoie autre chose qu'une ligne. S'il renvoie 0 lignes, vous obtiendrez un no_data_found exception. S'il renvoie plus d'une ligne, vous obtiendrez un too_many_rows exception. A moins que vous ne sachiez qu'il y aura toujours exactement 1 employé avec un salaire supérieur à 3000, vous ne voulez pas de SELECT INTO déclaration ici.

Très probablement, vous souhaitez utiliser un curseur pour parcourir (potentiellement) plusieurs lignes de données (je suppose également que vous aviez l'intention de faire une jointure appropriée entre les deux tables plutôt que de faire un produit cartésien, donc je suppose qu'il y a est un departmentID colonne dans les deux tableaux)

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;

Je suppose que vous apprenez également PL/SQL. Dans le vrai code, vous n'utiliseriez jamais dbms_output comme ceci et ne dépendrait pas de quiconque voyant les données que vous écrivez dans le dbms_output tampon.