0
votes

Erreur "Aucune donnée trouvée" lors de la compilation de la fonction PLSQL

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


2 commentaires

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 et VARCHAR ne sont pas standard - vous devez utiliser VARCHAR2 .


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ètre departmentNumber .


3 Réponses :


1
votes

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#;


0 commentaires

2
votes

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


0 commentaires

1
votes

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 !!


0 commentaires