Oracle: Verwendung von Variablen in Abfragen

sceppi

Mitglied
Hallo,
es geht mal wieder um PL/SQL.
Ich habe im Package. Im Head des Pages habe ich eine Variable tabellenname definiert und der auch einen Wert zugeorndet:

Code:
sTabellenname varchar2(10) := 'tabelle';

Jetzt möchte ich im Body darauf zugreifen können und zwar auf zwei Wegen.
1. Bei einer Variablendeklaration mittels %TYPE:
Code:
Result sTabellenname.Spaltenname%TYPE;

und 2. in einer SQL Abfrage:
Code:
Select spaltenname into Result from sTabellenname  where id = Parameter;

Leider klappt das so nicht und ich finde auch nirgends einen Hinweis, wie ich die Variablen verketten muss.
Wäre für eure Hilfe abermals dankbar.
MfG
sceppi
 
Zum einen ist der Link von planb2000 ganz gut, zum anderen nochmal kurz die Erklärung warum deine Idee so nicht klappt.

Die Angabe
SQL:
sTabellenname varchar2(10) := 'tabelle';
Result sTabellenname.Spaltenname%TYPE;
ist für PL/SQL ungefähr genauso unmöglich wie folgendes z.B. in C#
Code:
private string mytype = "int";
private mytype zahl;
Soll heissen, der Wert aus einer Variablen kann nicht als Typ interpretiert werden. PL/SQL muss ja bereits bei der Kompilierung validieren ob die Tabelle in sTabellenname auch wirklich die Spalte "Spaltenname" besitzt. PL/SQL muss aber andererseits davon ausgehen, dass sich der Inhalt der Variablen sTabellenname zur Laufzeit ändern kann....

Somit funktioniert auch das 3. Statement nicht. Bindevariablen können niemals als Platzhalter für Tabellennamen oder Spalten genutzt werden. Die einzige Möglichkeit ist die Zusammenstellung des SQLs als String mit dynamischem SQL:
SQL:
sSQL VARCHAR2(200);
sSQL := 'SELECT ' || sPaltenname || ' FROM ' || sTabellenname  || ' WHERE ID = :param ';
EXECUTE IMMEDIATE sSQL USING parameter RETURNING INTO Result;
( ungetestet, hab grade keine Doku, Syntax von EXECUTE IMMEDIATE so, oder so ähnlich ;-) )

oder

die Nutzung von "Ersetzungsvariablen" (mit &) die beim Einspielen der Prozedur von SQL*Plus ersetz werden.
 
Zuletzt bearbeitet von einem Moderator:
Hallo ihr beiden,
danke für eure Hilfe, das macht genau dass, was ich möchte:

Code:
sSQL := 'SELECT ' || sSpaltenname || ' FROM ' || sTabellenname  || ' WHERE Spalte = :param1 ';
EXECUTE IMMEDIATE sSQL INTO Result USING sParameter;
 

Neue Beiträge

Zurück