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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top