web-dev-qa-db-fra.com

PL / SQL ORA-01422: l'extraction exacte renvoie plus que le nombre de lignes demandé

Je reçois toujours cette erreur, je ne peux pas comprendre ce qui ne va pas.

DÉCLARER
*
ERREUR à la ligne 1:
ORA-01422: l'extraction exacte renvoie plus que le nombre de lignes demandé
ORA-06512: à la ligne 11

Voici mon code.

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

Une instruction SELECT INTO Générera une erreur si elle renvoie autre chose qu'une ligne. S'il retourne 0 ligne, vous obtiendrez une exception no_data_found. S'il renvoie plus d'une ligne, vous obtiendrez une exception too_many_rows. À moins que vous ne sachiez qu'il y aura toujours exactement 1 employé avec un salaire supérieur à 3000, vous ne voulez pas d'une déclaration SELECT INTO Ici.

Très probablement, vous voulez 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 une colonne departmentID 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 le PL/SQL. Dans le vrai code, vous n'utiliseriez jamais dbms_output Comme ceci et ne dépendriez pas que quiconque voit les données que vous écrivez dans le tampon dbms_output.

34
Justin Cave