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