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