En essayant de compiler afin d'exécuter les deux fonctions (@directory), j'obtiens une erreur sans données à la ligne 48 (ou à la ligne 13 pour la fonction). C'est l'erreur que je reçois. REMARQUE: SYSTEM est le serveur auquel je suis connecté.
SET ECHO ON; SET FEEDBACK ON; SET LINESIZE 100; SET PAGESIZE 100; SET SERVEROUTPUT ON; CREATE OR REPLACE FUNCTION DEPTPROJECT(departmentNumber IN NUMBER) RETURN VARCHAR IS dep# DEPARTMENT.D#%TYPE; depName DEPARTMENT.DName%TYPE; counter NUMBER(10,0); empNumber CHAR(5); empName VARCHAR2(30); result VARCHAR2(600); BEGIN SELECT D#, DNAME INTO dep#, depName FROM DEPARTMENT WHERE DEPARTMENT.D# = dep#; result := result || 'Department'|| dep# || '' || depName || chr (10); FOR i IN(SELECT P# , PTitle , Budget FROM PROJECT WHERE PROJECT.D# = dep# ORDER BY BUDGET DESC) LOOP result:= result || chr(9)|| 'Project: ' || i.P# || '' || i.PTitle || i.Budget || chr(10); FOR j IN(SELECT EMPLOYEE.Name, EMPLOYEE.E# FROM WORKSON INNER JOIN EMPLOYEE ON EMPLOYEE.E# = WORKSON.E# WHERE WORKSON.P# = i.P# ORDER BY EMPLOYEE.NAME ASC ) LOOP result:= result || chr(10) || j.E# || '' || j.Name || chr(10); END LOOP; END LOOP; RETURN result; END; / BEGIN FOR x IN(SELECT D# FROM DEPARTMENT) LOOP DBMS_OUTPUT.PUT_LINE(DEPTPROJECT(x.D#)); END LOOP; END; /
voici ma fonction
ERROR at line 1: ORA-01403: no data found ORA-06512: at "SYSTEM.DEPTPROJECT", line 13 ORA-06512: at line 4 ORA-06512: at line 4
3 Réponses :
Je suppose que la ligne 13 devrait utiliser la variable transmise à la fonction:
SELECT D#, DNAME INTO dep#, depName FROM DEPARTMENT WHERE DEPARTMENT.D# = departmentNumber;
Devrait être:
SELECT D#, DNAME INTO dep#, depName FROM DEPARTMENT WHERE DEPARTMENT.D# = dep#;
Lorsque vous sélectionnez une variable et il n'y a aucun enregistrement renvoyé, vous devez obtenir une erreur de données sans données. Je crois que la bonne façon d'écrire le code ci-dessus serait d'envelopper l'instruction SELECT avec son propre bloc de début / exception / extrémité.
Exemple: P>
SET ECHO ON; SET FEEDBACK ON; SET LINESIZE 100; SET PAGESIZE 100; SET SERVEROUTPUT ON; CREATE OR REPLACE FUNCTION DEPTPROJECT(departmentNumber IN NUMBER) RETURN VARCHAR IS dep# DEPARTMENT.D#%TYPE; depName DEPARTMENT.DName%TYPE; counter NUMBER(10,0); empNumber CHAR(5); empName VARCHAR2(30); result VARCHAR2(600); BEGIN SELECT D#, DNAME INTO dep#, depName FROM DEPARTMENT WHERE DEPARTMENT.D# = departmentNumber; result := result || 'Department'|| dep# || '' || depName || chr (10); FOR i IN(SELECT P# , PTitle , Budget FROM PROJECT WHERE PROJECT.D# = dep# ORDER BY BUDGET DESC) LOOP result:= result || chr(9)|| 'Project: ' || i.P# || '' || i.PTitle || i.Budget || chr(10); FOR j IN(SELECT EMPLOYEE.Name, EMPLOYEE.E# FROM WORKSON INNER JOIN EMPLOYEE ON EMPLOYEE.E# = WORKSON.E# WHERE WORKSON.P# = i.P# ORDER BY EMPLOYEE.NAME ASC ) LOOP result:= result || chr(10) || j.E# || '' || j.Name || chr(10); END LOOP; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN result := 'Record Not Found'; RETURN result; END; / BEGIN FOR x IN(SELECT D# FROM DEPARTMENT) LOOP DBMS_OUTPUT.PUT_LINE(DEPTPROJECT(x.D#)); END LOOP; END; /
Vous utilisez la requête suivante pour récupérer dep #
et depName
mais votre clause where est WHERE DEPARTMENT.D # = dep #
.
SELECT D#, DNAME INTO dep#, depName FROM DEPARTMENT WHERE DEPARTMENT.D# = dep#;
Ici dep #
est une variable que vous avez déclarée mais non initialisée.
Donc, dep #
est null
et la comparaison avec NULL
mèneront toujours à false, ce qui signifie que votre requête ne renvoie aucun enregistrement.
Comme vous avez utilisé INTO
dans votre requête, Oracle recherche exactement un enregistrement de cette requête mais il ne renvoie aucun enregistrement. Par conséquent, vous êtes confronté au problème.
Selon votre logique, modifiez la clause WHERE
pour inclure departmentNumber
dans la comparaison ou attribuez la valeur appropriée à dep #
avant de l'utiliser dans votre requête.
Assurez-vous également d'encapsuler votre requête SELECT .. INTO
dans BEGIN..EXCEPTION..END
pour éviter une telle exception dynamique. p>
Bravo !!
Ce ne sont pas des erreurs de compilation, ce sont des erreurs d'exécution. Une erreur de compilation commencerait par
PLS-
. De plus,SYSTEM
n'est pas un serveur, c'est un compte (que vous n'êtes pas censé utiliser pour le développement). De plus,CHAR
etVARCHAR
ne sont pas standard - vous devez utiliserVARCHAR2
.Oracle lève une exception NO_DATA_FOUND lorsque nous exécutons une instruction SELECT qui ne renvoie aucune donnée . Autrement dit, aucune ligne de la table ne correspond aux critères de la clause WHERE. Votre code a une requête qui peut lancer NO_DATA_FOUND: le SELECT de DEPARTMENT. L'explication la plus probable est donc que votre clause WHERE utilise la variable
dep #
- qui sera nulle - au lieu d'utiliser le paramètredepartmentNumber
.