0
votes

PL / SQL appelant une fonction à une procédure

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


0 commentaires

3 Réponses :


0
votes

Vous avez simplement oublié le point-virgule après Ouvrir C .

Et voici comment faire la même chose avec un curseur implicite, ce qui est beaucoup plus facile à traiter à mon avis: xxx


3 commentaires

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 dans () boucle ... End boucle; , ce qui facilite la tâche, comme vous ne pouvez pas Il faut déclarer un curseur, l'ouvrir, la boucle, vérifier l'extrémité du curseur et fermer le curseur. Ce que je montre est appelé un curseur implicite, car toute prise de récupération est faite pour vous dans les coulisses. C'est juste pour vous montrer qu'il existe une manière plus pratique. Peut-être que votre professeur vous montrera cela plus tard.


Juste ne jamais dire "je reçois une erreur", mais montrez-nous le message d'erreur à la place. Ne vous a pas devinez.



0
votes

Erreurs que je reçois:

Fonction show_sal compilé

Somme totale des salaires de Dallas = 10875

procédure PL / SQL complétée avec succès.

Procédure show_employeux compilé

erreur de ligne / col


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

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:

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:


2 commentaires

Cela vous montre la ligne et le problème. La 9ème ligne de la procédure est la suivante: v_name varchar2; . Le message d'erreur est Les contraintes de longueur de chaîne doivent être ... . Cela signifie que vous devez définir la longueur maximale de la chaîne, par ex. v_name varchar2 (100); . 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.



0
votes
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');

1 commentaires

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.