Auparavant, j'ai demandé de créer une fonction qui retourne le nombre total de salaires d'une ville de paramètres. J'ai choisi Dallas par exemple.Tables sont EMP et Dept: Vous pouvez les trouver ci-dessous
https://livesql.oracle.com/ apex / liveql / fichier / content_o5aeb2he08pyleptgcflzu9ycv.html p>
à tort, j'ai écrit dans ma langue au lieu de l'anglais à la fin de celui-ci mais je l'ai corrigé. P>
Maintenant, j'ai besoin de Créez une procédure qui répertorie les employés et leurs salaires à partir d'une autre carte de paramètres. Après eux, je dois appeler la fonction pour la deuxième ville.Problème est que je reçois une erreur pour la "boucle" de la procédure et je n'ai aucune idée pourquoi . P>
set serveroutput on; create or replace function show_sal (local dept.loc%type) return number as vval number; begin select sum(emp.sal) into vval from emp inner join dept on dept.deptno = emp.deptno where upper(dept.loc) = upper(local); return vval; end; / begin dbms_output.put_line('Total sum of salaries from DALLAS = ' || show_sal('DALLAS')); end; / ------------------------------------------------------------------------------------------------- CREATE OR REPLACE PROCEDURE show_employees(v_loc dept.loc%TYPE) AS CURSOR c IS SELECT ename,sal FROM emp INNER JOIN dept ON emp.deptno = dept.deptno WHERE UPPER(loc)=UPPER(v_loc) ORDER BY ename ASC; v_name VARCHAR2; v_salaries emp.sal%TYPE; BEGIN OPEN c LOOP FETCH c INTO v_name,v_salaries; EXIT WHEN c%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_name||' '|| v_salaries); END LOOP; CLOSE c; END; / EXECUTE show_employees('CHICAGO'); BEGIN show_sal('CHICAGO'); END; /
3 Réponses :
Vous avez simplement oublié le point-virgule après Et voici comment faire la même chose avec un curseur implicite, ce qui est beaucoup plus facile à traiter à mon avis: P> Ouvrir C CODE>.
Je comprends mais je dois toujours appeler cette fonction à la fin.Im un débutant et si mon Proffessor verrait cela, il saurait que je "trompé". J'ai toujours des erreurs après avoir mis Semicolon Dat.
Votre code était bien. Je viens de mettre le point-virgule manquant et cela devrait fonctionner. Quelle erreur obtenez vous? Je viens de vous montrer que vous pouviez également écrire la procédure avec pour
Juste ne jamais dire "je reçois une erreur", mais montrez-nous le message d'erreur à la place. Ne vous a pas devinez.
Erreurs que je reçois: p>
Fonction show_sal compilé p>
Somme totale des salaires de Dallas = 10875 P>
procédure PL / SQL complétée avec succès. P>
Procédure show_employeux compilé p>
erreur de ligne / col p>
9/9 pls-00215: Les contraintes de longueur de la chaîne doivent être dans la plage (1 .. 32767) Erreurs: vérifiez le journal du compilateur p>
erreur commençant à la ligne: 40 en commande - Commencer show_employeux ('Chicago'); FINIR; Rapport d'erreur - Ora-06550: ligne 1, colonne 61: Pls-00905: objet hr.show_employest est invalide Ora-06550: ligne 1, colonne 61: PL / SQL: déclaration ignorée 06550. 00000 - "Ligne% s, colonne% s: \ n% s" * Cause: généralement une erreur de compilation PL / SQL. * Action: p>
erreur de départ à la ligne: 42 en commande - COMMENCER show_sal ('Chicago'); FINIR; Rapport d'erreur - ORA-06550: ligne 2, colonne 1: Pls-00221: 'show_sal' n'est pas une procédure ou n'est indéfini ORA-06550: ligne 2, colonne 1: PL / SQL: déclaration ignorée 06550. 00000 - "Ligne% s, colonne% s: \ n% s" * Cause: généralement une erreur de compilation PL / SQL. * Action: p>
Cela vous montre la ligne et le problème. La 9ème ligne de la procédure est la suivante: v_name varchar2; code>. Le message d'erreur est
Les contraintes de longueur de chaîne doivent être ... code>. Cela signifie que vous devez définir la longueur maximale de la chaîne, par ex.
v_name varchar2 (100); code>. Le reste peut être des erreurs ultérieures.
De toute façon. Ce n'est pas une réponse, vous devez donc la supprimer. Si vous souhaitez ajouter des détails à votre demande, cliquez sur le lien Modifier sous la demande afin de le faire.
set serveroutput on; create or replace function show_sal (local dept.loc%type) return number as vval number; begin select sum(emp.sal) into vval from emp inner join dept on dept.deptno = emp.deptno where upper(dept.loc) = upper(local); return vval; end; / begin dbms_output.put_line('Total sum of salaries from DALLAS = ' || show_sal('DALLAS')); end; / ------------------------------------------------------------------------------------------------- CREATE OR REPLACE PROCEDURE show_employees(v_loc dept.loc%TYPE) AS CURSOR C is SELECT ename,sal FROM emp,dept WHERE emp.deptno=dept.deptno AND UPPER(loc)=UPPER(v_loc) ORDER BY ename ASC; v_nume emp.ename%TYPE; v_salariu emp.sal%TYPE; v_tot emp.sal%TYPE; BEGIN v_tot:=show_sal('CHICAGO'); dbms_output.put_line('nume salar total: '||v_tot); OPEN C; LOOP FETCH C INTO v_nume,v_salariu; EXIT WHEN C%NOTFOUND; dbms_output.put_line(v_nume||' '||v_salariu); END LOOP; CLOSE C; END; / EXECUTE show_employees('CHICAGO');
Cela fonctionne pour mettre l'appel de la fonction dans le corps de la procédure en ajoutant une variable additionnelle à celle-ci afin qu'il puisse fonctionner.