2017-05-12 1 views
0

J'essaie d'utiliser une procédure externe autonome à partir d'un curseur, de prendre une variable et de la renvoyer à la procédure, où la procédure insère les valeurs dans une autre table. Obtenir des erreursErreur de procédure autonome dans le curseur vers une table de base

PROCEDURE:

CREATE OR REPLACE PROCEDURE proc_test 
(p_inn newtable.totalhours%TYPE) AS 

BEGIN 
p_inn := p_inn - p_inn + 1; 
INSERT INTO proceduretest (value) 
VALUES (p_inn); 
END proc_test; 
/

Le code avec des curseurs

SET SERVEROUTPUT ON 
DECLARE 
     v_idno paydata1.idno%TYPE; 
     v_name paydata1.name%TYPE; 
     v_hrs paytran1.hourswk%TYPE; 
     v_hrsT paytran1.hourswk%TYPE; 
     v_code paydata1.jobcode%TYPE; 
     v_payh paydata1.payhr%TYPE; 
     v_sal paydata1.salary%TYPE; 
     v_OT NUMBER(6,2); 
     CURSOR payday IS 
     SELECT idno, name FROM paydata1 
     ORDER BY idno; 
     CURSOR paytray IS 
     SELECT hourswk FROM paytran1 
     WHERE v_idno = idno 
     ORDER BY idno; 
     CURSOR total IS 
     SELECT idno, name, jobcode, salary, payhr 
     FROM paydata1 
     WHERE v_idno = idno; 
     BEGIN 
     OPEN payday; 
     LOOP 
      FETCH payday INTO v_idno, v_name; 
      EXIT WHEN payday%NOTFOUND; 
      IF paytray%ISOPEN THEN 
      CLOSE paytray; 
      END IF; 
      OPEN paytray; 
      v_hrsT := 0; 
      LOOP 
      FETCH paytray INTO v_hrs; 
      EXIT WHEN paytray%NOTFOUND; 
      v_hrsT := v_hrsT + v_hrs; 
      END LOOP; 
      OPEN total; 
      FETCH total INTO v_idno, v_name, v_code, v_sal, v_payh; 
      WHILE total%FOUND LOOP 
       IF v_code = 'S' THEN 
       v_sal := v_sal/52; 
       DBMS_OUTPUT.PUT_LINE(v_name || ' - Total hours worked is: ' || v_hrsT); 
       proc_test (v_hrsT); <------------------ 

       ELSE 
       IF v_hrsT > 40 THEN 
       v_OT := v_hrsT - 40; 
       v_OT := v_OT * (v_payh * 1.5); 
       v_OT := v_OT + (40 * v_payh); 
       v_sal := v_OT; 
       ELSE 
       v_sal := v_hrsT * v_payh; 
       END IF; 



       DBMS_OUTPUT.PUT_LINE(v_name || ' - Total hours worked is: ' || v_hrsT); 
proc_test (v_hrsT); <--------------- 
END IF; 
       FETCH total INTO v_idno, v_name, v_code, v_sal, v_payh; 
      END LOOP; 
      CLOSE total; 
      CLOSE paytray; 
      END LOOP; 
     CLOSE payday; 
END; 
/
SET SERVEROUTPUT OFF 

Je me excuse, une partie du code obtenu en désordre vers la fin, mais je l'ai dessiné des flèches à l'endroit où la procédure est appelée.

ERREURS:

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/1  PL/SQL: Statement ignored 
5/1  PLS-00363: expression 'P_INN' cannot be used as an assignment 
     target 
+1

Quelles sont les erreurs obtenez-vous ? –

+0

Pourquoi avez-vous trois curseurs sélectionnant à partir de la même table initié imbriqués les uns les autres? – APC

+0

Pour référence ultérieure, il ne s'agit pas d'une procédure externe. Les ExtProcs sont quelque chose de différent. Le terme correct est autonome. – APC

Répondre

1

Paramètres par défaut avec la direction définie à IN. Nous ne pouvons pas affecter (changer) la valeur d'un paramètre IN. Vous n'avez pas défini la direction de P_INN de sorte qu'il est dans par défaut, donc vous ne pouvez pas le faire

p_inn := p_inn - p_inn + 1; 

C'est ce que le message d'erreur vous dit.

Si vous n'avez pas besoin de la valeur manipulée pour autre chose que de l'insérer simplement le faire ....

CREATE OR REPLACE PROCEDURE proc_test 
    (p_inn newtable.totalhours%TYPE) AS  
BEGIN 
    INSERT INTO proceduretest (value) 
    VALUES (p_inn - p_inn + 1); 
END proc_test; 
/

Sinon, utilisez une variable locale:

CREATE OR REPLACE PROCEDURE proc_test 
    (p_inn IN newtable.totalhours%TYPE) 
AS  
    l_inn newtable.totalhours%TYPE; 
BEGIN 
    l_inn := p_inn - p_inn + 1; 
    INSERT INTO proceduretest (value) 
    VALUES (l_inn); 
END proc_test; 
/
+0

Merci l'homme, avait besoin d'une bonne ventilation pour comprendre un peu mieux. –

1

Votre procédure attend deux paramètres, mais vous l'appelez avec un.

EDIT: Après votre modification, vous utilisez le paramètre comme s'il s'agissait d'une variable. Ceci est uniquement autorisé pour les paramètres OUT. Quoi qu'il en soit, votre calcul n'a pas de sens.

Pour ce faire, modifiez votre code comme ceci:

CREATE OR REPLACE PROCEDURE proc_test (p_inn IN OUT newtable.totalhours%TYPE) AS 
+0

Même avec un seul je reçois l'erreur. Changement de la procédure dans le message pour correspondre à celui que j'utilise maintenant. –