2008-09-04 8 views
0

Je pense que je pourrais manquer quelque chose ici. Voici la partie pertinente de la gâchette:PLS-00306 erreur sur l'appel au curseur

CURSOR columnNames (inTableName IN VARCHAR2) IS 
    SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
/* Removed for brevity */ 
OPEN columnNames('TEMP'); 

Et voici le message d'erreur que je revenir,

 
27/20 PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES' 
27/2 PL/SQL: Statement ignored 

Si je comprends correctement la documentation, qui devrait fonctionner, mais depuis ce n'est pas que je dois faire quelque chose de mal. Des idées?


@Matthew - J'apprécie l'aide, mais la raison pour laquelle je suis confus est parce que ce morceau de code ne fonctionne pas pour moi et soulève les erreurs mentionnées. Nous avons d'autres éléments déclencheurs dans la base de données avec le code presque exactement comme ce donc je ne suis pas sûr que ce soit quelque chose que je fait de mal, ou quelque chose avec ce que je suis en train de stocker la détente, etc.


@Matthew - Eh bien, maintenant je me sens gêné. J'ai fait un copier/coller du code que vous avez fourni dans un nouveau trigger et cela a bien fonctionné. Je suis donc retourné dans la gâchette d'origine et ai essayé et reçu le message d'erreur à nouveau, mais cette fois j'ai commencé à supprimer des choses sur la gâchette et après s'être débarrassé de cette ligne,

FOR columnName IN columnNames LOOP 

choses sauvé bien. Donc, il se trouve que là où je pensais que l'erreur était, n'était pas réellement l'erreur était.

Répondre

0

@Rob

Si vous coupez/collez le code que j'ai ici, ça marche?

Comment/où appelez-vous votre code? son dans un déclencheur est-il?

La requête que vous avez écrit ici, est-ce réellement le code produisant l'erreur, ou tout simplement un exemple (par exemple, peut vous reproduire l'erreur avec la requête que vous avez ci-dessus)

0

Fonctionne bien pour moi.

create or replace procedure so_test_procedure as 
CURSOR columnNames (inTableName IN VARCHAR2) IS 
    SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN  
OPEN columnNames('TEMP'); 
CLOSE columnNames; 
END; 

procedure so_test_procedure Compiled. 
execute so_test_procedure(); 

anonymous block completed 
1

Afin de clarifier la cause de la question . Comme vous le dites

OPEN columnNames ('TEMP');

travaillé pendant

POUR columnName EN BOUCLE columnNames

n'a pas. Le FOR fonctionnerait très bien si elle comprenait également le paramètre comme ceci:

POUR EN columnName columnNames (« TEMP ») LOOP

Vous ne montrez pas le code où vous chercher les lignes si je peux Ne dites pas votre but, mais où je travaille OPEN est couramment utilisé pour récupérer la première ligne (dans ce cas, le nom de la première colonne de la table donnée) tandis que le FOR est utilisé pour parcourir toutes les lignes retournées.

@ Commentaire de Rob.Je ne suis pas autorisé à commenter donc mise à jour ici à la place. Le paramètre manquant est ce que je décris ci-dessus. Vous avez ajouté une réponse indiquant que vous avez simplement supprimé la boucle FOR. Il ne vous a pas semblé, à l'époque, comprendre pourquoi la suppression faisait une différence. C'est pourquoi j'ai essayé d'expliquer car, selon votre besoin, la boucle FOR pourrait être une meilleure solution.

+0

Frode - La raison pour laquelle je recevais l'erreur était parce que j'essayais de faire un appel à une requête paramétrée dans la boucle FOR sans fournir de paramètre. – rjzii