2010-12-30 2 views
3

J'essaie de créer une procédure et elle a été créée sans erreur. Cependant quand j'essaye de l'exécuter alors j'obtiendrai l'erreur suivante. S'il vous plaît conseillerCREATE Oracle Procédure

SQL> begin 
    2 Update_STUD_Fin ('1011'); 
    3 end; 
    4/
begin 
* 
ERROR at line 1: 
ORA-06511: PL/SQL: cursor already open 
ORA-06512: at "ORAIN.UPDATE_STUD_FIN", line 3 
ORA-06512: at "ORAIN.UPDATE_STUD_FIN", line 8 
ORA-06512: at line 2 

La procédure est

SQL> CREATE OR REPLACE PROCEDURE Update_STUD_Fin (AIDY_CODE IN VARCHAR2) IS 
    2 CURSOR PublicationC IS 
    3  SELECT SGidm from SGB 
    4  WHERE SGCODE_EFF ='201030'; 
    5 BEGIN 
    6 OPEN PublicationC; 
    7 
    8 FOR PublicationR IN PublicationC 
    9 LOOP 
10  DBMS_OUTPUT.PUT_LINE(PublicationR.SGidm); 
11 END LOOP; 
12 
13 close PublicationC; 
14 
15 END; 
16/

Procedure created. 
+0

Merci pour le formatage, BoltClock. –

+0

@Adam: Tout dans une journée de travail. – BoltClock

+1

-1: Cette question a été répondue ici: http://stackoverflow.com/questions/4564689. Avez-vous créé un nouveau compte et vous le demandez à nouveau? – Codo

Répondre

11

Vous ne pouvez pas ouvrir le curseur explicity et utiliser aussi dans une boucle implicite. Vous choisissez beaucoup soit implicite (boucle FOR) ou explicite (OPEN/FETCH/CLOSE).

7

Si vous utilisez un curseur avec FOR/IN/LOOP, vous n'avez pas besoin de l'ouvrir explicitement. Il suffit d'écrire:

SQL> CREATE OR REPLACE PROCEDURE Update_STUD_Fin (AIDY_CODE IN VARCHAR2) IS 
    2 CURSOR PublicationC IS 
    3  SELECT SGidm from SGB 
    4  WHERE SGCODE_EFF ='201030'; 
    5 BEGIN 
    8 FOR PublicationR IN PublicationC 
    9 LOOP 
10  DBMS_OUTPUT.PUT_LINE(PublicationR.SGidm); 
11 END LOOP; 
12 
15 END; 
16/
+0

Vous n'avez pas non plus besoin du 'close', sûrement? –

+0

Merci pour l'indice. Je l'ai réparé. – Codo

0

6512 Un message d'erreur indique le numéro de ligne du code PL-SQL indiquant que l'erreur est survenue. Etes-vous sûr de ne pas avoir d'autre message avant?

0

Je ne sais pas pourquoi vous recevez un message ORA-06512 sans autre message d'erreur au-dessus. Êtes-vous sûr d'avoir collé l'intégralité du message d'erreur?

ORA-06512 est uniquement utilisé lors de l'impression de traces de pile lorsqu'une exception est générée en code PL/SQL. Voici un exemple complet:

 
ERROR at line 1: 
ORA-01001: invalid cursor 
ORA-06512: at "USER.SOME_PROCEDURE", line 5 
ORA-06512: at line 1 

La véritable erreur ici est l'ORA-01001. Les ORA-06512 indiquent simplement où l'erreur s'est produite: sur la ligne 5 de USER.SOME_PROCEDURE, qui a été appelée par la ligne 1 d'un bloc PL/SQL anonyme.

Jeter un oeil à votre code, je peux repérer quelques problèmes:

  • Lorsque vous utilisez FOR ... IN some_cursor LOOP ... alors vous ne devriez pas explicitement ouvrir et fermer le curseur. Cela sera fait pour vous automatiquement par la boucle FOR.

  • Vous ne devriez pas essayer non plus de fermer un curseur qui n'a pas été ouvert. Si vous essayez de le faire, vous obtiendrez un message d'erreur ORA-01001 'curseur invalide'. Je suppose que vous avez mis cela pour s'assurer que le curseur était fermé avant de l'ouvrir, mais malheureusement vous ne pouvez pas le faire.

En bref, vous devez supprimer tous les OPEN et CLOSE déclarations de votre procédure et essayez à nouveau.