VIEW in PL/SQL abhängig von Parameter erstellen

Hallo allerseits,

mein Problem ist das folgende: Ich möchte in einer PL/SQL-Prozedur in Abhängigkeit von einem Parameter, den ich übergebe, eine View erzeugen. Die Prozedur soll in etwa so aussehen:

(v_parameter IN xxx%TYPE)
IS
BEGIN
EXECUTE IMMEDIATE ‚CREATE OR REPLACE VIEW aview AS
SELECT sth FROM
atable WHERE RTRIM(parameter,‘’ ‚‘)=v_parameter WITH READ ONLY’;
COMMIT;
END;

Die Prozedur wird als ‚valid‘ erkannt, beim Start mit einem Parameter erhalte ich die Fehlermeldung:

ERROR at line 1:
ORA-00904: invalid column name
ORA-06512: at „PROZ“, line 4
ORA-06512: at line 1

Wenn ich im ‚EXECUTE IMMEDIATE‘-Teil die Variable durch einen konkreten Wert ersetze, funktioniert das ganze auch.

Kann ich also innerhalb von EXECUTE IMMEDIATE keine Variablen verwenden, oder was mache ich falsch?
Wenn das nicht gehen sollte, wäre ich auch für Alternativvorschläge dankbar.

Beste Grüsse

Michael Zadlo

Hallo Michael!

Hallo allerseits,

mein Problem ist das folgende: Ich möchte in einer
PL/SQL-Prozedur in Abhängigkeit von einem Parameter, den ich
übergebe, eine View erzeugen. Die Prozedur soll in etwa so
aussehen:

Was hast du mit dem resultierenden View vor? Wäre nicht ein allgemeiner View, dem du erst beim SELECT die jeweilige Einschränkung bekanntgibst zielführender (weil allgemeiner)?

Also:

CREATE OR REPLACE aview AS
 SELECT sth, RTRIM(parameter, ' ') par
 FROM atable
 WITH READ ONLY;

und die Abfrage dazu:

SELECT sth FROM aview WHERE par=v\_parameter;

(v_parameter IN xxx%TYPE)
IS
BEGIN
EXECUTE IMMEDIATE ‚CREATE OR REPLACE VIEW aview AS
SELECT sth FROM
atable WHERE RTRIM(parameter,‘’ ‚‘)=v_parameter WITH READ
ONLY’;
COMMIT;
END;

Die Prozedur wird als ‚valid‘ erkannt,

Klaro. Alles was nach EXECUTE IMMEDIATE kommt kann PL/SQL erst bei der Ausführung auswerten, und sonst tut deine Prozedur ja nichts (den COMMIT kannst du dir eigentlich auch sparen, weil ein DDL statement (wie eben auch CREATE VIEW) immer einen impliziten COMMIT macht. Allerdings gehen hier die Meinungen auseinander: Die einen meinen, man sollte den COMMIT hinschreiben, damit das auch sofort klar ist, die anderen raten davon ab, weil sonst jemand auf die irrige Idee kommen könnte den COMMIT zu entfernen würde dazu führen, dass die Transaktion offen bliebe.

Wie auch immer:

beim Start mit einem
Parameter erhalte ich die Fehlermeldung:

ERROR at line 1:
ORA-00904: invalid column name
ORA-06512: at „PROZ“, line 4
ORA-06512: at line 1

Wenn ich im ‚EXECUTE IMMEDIATE‘-Teil die Variable durch einen
konkreten Wert ersetze, funktioniert das ganze auch.

Kann ich also innerhalb von EXECUTE IMMEDIATE keine Variablen
verwenden, oder was mache ich falsch?

Doch, kannst du, allerdings anders:

aStatement := 'CREATE VIEW [...] WHERE parameter='||v\_parameter||' [...]'
EXECUTE IMMEDIATE aStatement;

beziehungsweise:

aStatement := 'CREATE VIEW [...] WHERE parameter='''||TO\_CHAR(v\_parameter)||''' [...]'
EXECUTE IMMEDIATE aStatement;

Beste Grüsse

Michael Zadlo

Gruß auch,
Martin

hi!

genauso wie beim dbms_sql:

aus

atable WHERE RTRIM(parameter,’’ ‚‘)=v_parameter WITH READ ONLY’;

wird

atable WHERE RTRIM(paramter,’’ ‚‘)=:blablabla WITH READ ONLY’ using v_parameter;

wobei die „:“-variablen beim using dann in der entsprechenden reihenfolge angegeben werden müssen

bsp:
atable where parameter in (:x,:y,:z)’ using v_x,v_y,v_z;

grüße,
tomh