Question

Je pense que je manque peut-être quelque chose ici.Voici la partie pertinente du déclencheur :

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 reçois,

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

Si je comprends bien la documentation, cela devrait fonctionner, mais comme ce n'est pas le cas, je dois faire quelque chose de mal.Des idées?


@Matthieu - J'apprécie l'aide, mais la raison pour laquelle je suis confus est que ce morceau de code ne fonctionne pas pour moi et génère les erreurs référencées.Nous avons d'autres déclencheurs dans la base de données avec un code presque exactement le même, donc je ne sais pas si c'est quelque chose que j'ai mal fait, ou quelque chose avec la façon dont j'essaie de stocker le déclencheur, etc.


@Matthieu - Eh bien, maintenant, je me sens gêné.J'ai fait un copier/coller du code que vous avez fourni dans un nouveau déclencheur et cela a bien fonctionné.Je suis donc revenu au déclencheur d'origine, je l'ai essayé et j'ai reçu à nouveau le message d'erreur, sauf que cette fois, j'ai commencé à supprimer des éléments du déclencheur et après m'être débarrassé de cette ligne,

FOR columnName IN columnNames LOOP

Les choses ont bien été sauvées.Il s'avère donc que là où je pensais que l'erreur se trouvait, ce n'était pas réellement là où se trouvait l'erreur.

Était-ce utile?

La solution

@Rob

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

Comment/où appelez-vous votre code ?c'est dans un déclencheur, n'est-ce pas ?

La requête que vous avez écrite ici correspond en fait au code produisant l'erreur, ou juste à un exemple (par exemple, pouvez-vous reproduire l'erreur avec la requête que vous avez ci-dessus)

Autres conseils

Pour clarifier la cause du problème.Comme tu le dis

OPEN columnNames('TEMP');

travaillé pendant que

POUR nom_colonne IN noms_colonnes BOUCLE

pas.L'instruction FOR fonctionnerait correctement si elle incluait également le paramètre comme ceci :

POUR nom_colonne IN noms_colonnes('TEMP') BOUCLE

Vous n'affichez pas le code où vous récupérez les lignes, donc je ne peux pas dire votre objectif, mais là 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 renvoyées.

Commentaire de @Rob.Je ne suis pas autorisé à commenter, alors je mets à jour ici.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.À l’époque, il ne semblait pas que vous compreniez pourquoi sa suppression faisait une différence.C'est pourquoi j'ai tenté de l'expliquer puisque, selon vos besoins, la boucle FOR pourrait être une meilleure solution.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top