wie definieren Sie dynamische Typen in plsql
Habe ich ein Vorgehen wie dieses:
create or replace procedure pname (tn varchar2) is
-- here i want to declare the variable
col1 tn%COL_ID
begin
end;
und ich weiß, dass jede Tabelle leite ich als argument enthält die Spalte mit dem Namen als COL_ID. Aber ich bin nicht in der Lage, dies zu tun, erhalte ich eine Fehlermeldung wie diese
PLS-00487: Ungültige Referenz auf variable 'tn'
PL/SQL: Element ignoriert
PLS-00487: Ungültige Referenz auf variable 'tn'
PL/SQL: Element ignoriert
Bitte helfen Sie mir, wie Sie Variablen deklarieren, so.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Interessante Frage. APC darauf hingewiesen, Oracle nicht Reflexion pro sagen wie die anderen Sprachen, so übergeben Sie den Namen (varchar2) nicht helfen, Oracle viel (esp zur compile-Zeit). Was ich glaube, was Sie hier sagen, ist, dass Sie haben eine Reihe von Tabellen, die alle teilen bestimmte Merkmale (1 oder mehrere Spalten des gleichen Typs auf die gleiche Weise), so dass Sie wollen, um eine generische Funktion, die die Arbeit für alle von Ihnen.
Können Sie dies tun, aber Sie haben, um zu definieren, ein Objekt-Typ, definiert die gemeinsamen Spalten und Typen, die Ihre verschiedenen Tabellen zu teilen. Sagen, dies ist der folgende 2 Spalten:
Nun Ihrer Funktion (oder Prozedur) akzeptieren würde diesen Typ als param:
Und würden Sie es nennen mögen:
Die einzige andere Möglichkeit die ich mir denken kann ist, zu akzeptieren, eine schwach typisierte sys_refcursor und dann Gewalt aufrufen von Prozeduren zum senden in einer richtigen cursor (riskant wegen möglicher Laufzeit-Ausnahmen und nicht sehr klar). Ich bevorzuge die oben erwähnten Ansatz, wenn die Codierung eine "generische" Funktion.
BEARBEITEN
Um vollständig zu sein, ich werf mich in die sys_refcursor Beispiel, das ich oben erwähnte:
Und nennen mag:
HINWEIS
Dies scheint übermäßig trivial mit nur 2 Spalten (warum nicht einfach set params als varchar2 und Nummer), aber Sie haben möglicherweise Dutzende von Spalten, die Sie wollen, um die Arbeit auf in der Funktion und der input-Objekt kann eine beliebige Anzahl von Ihnen besiedelt.
Cheers
Die syntax ist:
In der Oracle-Dokumentation-set ist online. Finden Sie hier. Die Informationen über % - TYP ist in die PL/SQL User ' s Guide.
Fairer Punkt. Ich war der Annahme, dass jede Erklärung von SP1 war das gleiche Datentyp, daher erklärt es mit einem festen Tabellennamen arbeiten würde, für alle Tabellen. Ist dies nicht der Fall ist, dann Stimme ich meine Lösung nicht funktioniert.
Das Problem mit der übergabe einer Tabelle Namen ist das übliche: PL/SQL nicht unterstützt. Es hat nicht so etwas wie reflection in Java.
Es ist immer eine dynamische SQL-aber das kann auch zu viel des guten. Ich denke der OP braucht, um mehr details zu bieten über das, was Sie versuchen zu erreichen.
Haben Sie einen Blick auf die verwendeten Datentypen von
COL_ID
in alle Tabellen, die Sie möglicherweise pass auf das Verfahren. Die Chancen sind Sie alle passen in einen der elementaren Datentypen, d.h.NUMBER
,VARCHAR2(4000)
.Erstellen Sie eine separate Prozedur für jeden Datentyp, rufen Sie die entsprechende version des Verfahrens (oder, arbeiten Sie heraus, welche variable zu verwenden, die mit Logik innerhalb der Prozedur) und Mach dir keine sorgen über die Verankerung der Typ.