PLS-00306 Fehler beim Aufruf des Cursors
Frage
Ich glaube, ich könnte hier etwas übersehen.Hier ist der relevante Teil des Auslösers:
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 ist die Fehlermeldung, die ich zurückerhalte:
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 verstehe, sollte das funktionieren, aber da dies nicht der Fall ist, muss ich etwas falsch machen.Irgendwelche Ideen?
@Matthew – Ich schätze die Hilfe, bin aber verwirrt, weil dieser Code bei mir nicht funktioniert und die genannten Fehler verursacht.Wir haben andere Auslöser in der Datenbank, deren Code fast genau diesem entspricht. Daher bin ich mir nicht sicher, ob ich etwas falsch gemacht habe oder an der Art und Weise, wie ich versuche, den Auslöser zu speichern usw., liegt.
@Matthew - Nun, jetzt wird es mir peinlich.Ich habe den von Ihnen bereitgestellten Code kopiert und in einen neuen Trigger eingefügt, und es hat einwandfrei funktioniert.Also ging ich zurück zum ursprünglichen Auslöser, probierte es aus und erhielt erneut die Fehlermeldung, außer dass ich dieses Mal anfing, Dinge aus dem Auslöser zu löschen, und nachdem ich diese Zeile entfernt hatte,
FOR columnName IN columnNames LOOP
Die Dinge sind gut gespeichert.Es stellt sich also heraus, dass dort, wo ich dachte, der Fehler sei, in Wirklichkeit nicht der Fehler war.
Lösung
@Rauben
Funktioniert es, wenn Sie den Code, den ich hier habe, ausschneiden/einfügen?
Wie/wo rufst du deinen Code auf?Es liegt an einem Auslöser, oder?
Die Frage, die Sie hier geschrieben haben, ist, dass es sich tatsächlich um den Code handelt, der den Fehler verursacht, oder nur um ein Beispiel (z. B. können Sie den Fehler mit der obigen Frage reproduzieren).
Andere Tipps
Um die Ursache des Problems zu klären.Wie Sie sagen
OPEN ColumnNames('TEMP');
arbeitete während
FOR Spaltenname IN Spaltennamen LOOP
nicht.Die FOR-Anweisung würde gut funktionieren, wenn sie auch den folgenden Parameter enthalten würde:
FOR ColumnName IN ColumnNames('TEMP') LOOP
Sie zeigen den Code nicht dort an, wo Sie die Zeilen abrufen, daher kann ich Ihren Zweck nicht sagen, aber wo ich arbeite, wird OPEN üblicherweise verwendet, um die erste Zeile (in diesem Fall den ersten Spaltennamen der angegebenen Tabelle) abzurufen, während die FOR wird verwendet, um alle zurückgegebenen Zeilen zu durchlaufen.
@Robs Kommentar.Da es mir nicht gestattet ist, einen Kommentar abzugeben, aktualisiere ich stattdessen hier.Der fehlende Parameter ist der, den ich oben beschrieben habe.Sie haben eine Antwort hinzugefügt, die besagt, dass Sie einfach die FOR-Schleife gelöscht haben.Es schien damals nicht so, als hätten Sie verstanden, warum das Löschen einen Unterschied machte.Aus diesem Grund habe ich versucht, es zu erklären, da je nach Bedarf die FOR-Schleife möglicherweise die bessere Lösung ist.
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