2008-09-04 18 views
0

Ich denke, ich könnte etwas hier fehlen. Hier ist der relevante Teil des Abzugs:PLS-00306 Fehler beim Aufruf des Cursors

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

Und hier wird die Fehlermeldung, dass ich zurückbekommen,

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

Wenn ich die Dokumentation richtig bin zu verstehen, die funktionieren sollen, aber da es ist nicht ich muss etwas falsch machen. Irgendwelche Ideen?


@Matthew - ich schätze die Hilfe, aber der Grund, dass ich verwirrt bin, ist, weil dieses Stück Code ist nicht für mich arbeiten und hebt die Fehler verwiesen. Wir haben andere Auslöser in der Datenbank mit Code fast genau wie das so bin ich nicht sicher, ob es etwas ist, das ich falsch gemacht habe, oder etwas mit, wie ich versuche, den Auslöser zu speichern usw.


@Matthew - Nun, jetzt fühle ich mich peinlich berührt. Ich habe den Code, den Sie eingegeben haben, in einen neuen Trigger kopiert und eingefügt. Also ging ich zurück in die ursprünglichen Auslöser und versuchte es und erhielt die Fehlermeldung erneut, außer diese Zeit begann ich Sachen zu löschen aus dem Trigger und nach dieser Zeile loszuwerden,

FOR columnName IN columnNames LOOP 

Dinge gespeichert in Ordnung. So stellt sich heraus, dass, wo ich dachte, der Fehler war, war nicht wirklich der Fehler war.

Antwort

0

@ Rob

Wenn Sie den Code habe ich hier Ausschneiden/Einfügen, funktioniert es?

Wie/wo rufen Sie Ihren Code an? es ist in einem Trigger ist es?

Die Abfrage Sie hier geschrieben haben, dass die Herstellung der Fehler tatsächlich der Code ist, oder einfach nur ein Beispiel

0

Funktioniert gut für mich.

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

Um die Ursache des Problems zu klären (zB können Sie den Fehler mit der Abfrage, die Sie oben haben zu reproduzieren) . Wie Sie sagen

OPEN columnNames ('TEMP');

arbeitete während

FÜR column IN column LOOP

nicht. Die FOR-Anweisung würde gut funktionieren, wenn es auch den Parameter wie so enthalten:

FÜR column IN column (‚TEMP‘) LOOP

Sie den Code nicht zeigen, wo Sie die Zeilen holen so kann ich Erzähle deinen Zweck nicht, aber wo ich arbeite, wird OPEN normalerweise verwendet, um die erste Zeile (in diesem Fall den ersten Spaltennamen der gegebenen Tabelle) zu holen, während das FOR verwendet wird, um alle zurückgegebenen Zeilen zu durchlaufen.

@ Robs Kommentar.Ich darf nicht kommentieren, sondern hier aktualisieren. Der fehlende Parameter ist das, was ich oben beschrieben habe. Sie haben eine Antwort hinzugefügt, die besagt, dass Sie die FOR-Schleife einfach gelöscht haben. Es sah nicht so aus als ob du zu der Zeit verstanden hättest, warum das Löschen etwas bewirkt hat. Deshalb habe ich versucht zu erklären, da die FOR-Schleife je nach Bedarf eine bessere Lösung sein könnte.

+0

Frode - Der Grund für den Fehler war, dass ich versuchte, eine parametrisierte Abfrage in der FOR LOOP aufzurufen, ohne einen Parameter anzugeben. – rjzii

Verwandte Themen