Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Definieren Sie eine VIEW in Oracle, ohne CREATE zu verwenden

Das Einholen der richtigen Berechtigungen und das Erstellen permanenter Objekte ist der beste Ansatz. Es hört sich so an, als würde diese Ansicht nur in einem einzigen Skript verwendet, was die Erstellung nicht unbedingt weniger gültig macht, aber je nach DBA und Richtlinien möglicherweise schwieriger zu rechtfertigen ist. Es lohnt sich auf jeden Fall, diesen Ansatz auszuprobieren, wie @DCookie vorgeschlagen hat.

Wenn dies fehlschlägt, kann es je nach Client, in dem Sie dieses Skript ausführen, möglicherweise hackige Problemumgehungen geben.

Zum Beispiel ist es in SQL*Plus möglich Substitutionsvariablen zu missbrauchen um etwas in die Nähe dessen zu bekommen, was Sie beschreiben. Dies verwendet die define Befehl um eine Substitutionsvariable zu erstellen, die die 'view'-Abfrage enthält, und diese Variable dann innerhalb eines WITH verwendet Klausel. (Sie können nicht den gesamten with ersetzen so, aber es ist vielleicht sowieso klarer). Ich habe eine triviale Dummy-Abfrage verwendet:

define tempview_query = 'SELECT * -
FROM dual -
UNION ALL -
SELECT * -
FROM dual'

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

Wenn das Skript ausgeführt wird, ist die erzeugte Ausgabe:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

Ich habe auch set verify off ausgeführt um die Ersetzungen auszublenden, aber das Einschalten kann aufschlussreich sein, um zu sehen, was passiert.

Beachten Sie die Bindestriche am Ende jeder Zeile der Abfrage; das ist das Fortsetzungszeichen , und als define Dokumente erwähnen:

also die 'neue' Abfrage, die von set verify on angezeigt wird wird Ihre gesamte Ansichtsabfrage in einer einzigen Zeile haben (wenn Sie sie anzeigen). Es ist möglich, dass Sie bei einer ausreichend langen Abfrage eine Begrenzung der Zeilenlänge erreichen, aber hoffentlich werden Sie diesen Punkt nicht erreichen (außer Sie haben es getan; siehe unten).

Sie können dasselbe in SQL Developer tun, aber dort muss die Fortsetzung zwei Bindestriche verwenden, also:

define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'

außer dass es nicht ganz dasselbe ist wie die Fortsetzung in SQL*Plus; Hier muss die Definition mit einem Bindestrich enden, aber sie wird nicht so ersetzt, wie es die SQL*Plus-Dokumentation beschreibt - also mit einem einzelnen Bindestrich funktioniert die Definition, aber die Abfrage endet ungültig. (Zumindest in 4.2.0; möglicherweise ein Fehler ...) Durch die Verwendung von zwei Bindestrichen funktioniert die mehrzeilige Definition immer noch, die Bindestriche bleiben Teil der Abfrage, werden aber als Kommentarmarkierungen behandelt; Sie lassen die ersetzte Abfrage also seltsam aussehen (wiederum, wenn Sie sie anzeigen), verhindern aber nicht, dass sie funktioniert. Sie werden es nicht bemerken, wenn Sie die set verify off es sei denn, jemand schaut in v$sql nach .

Wenn Ihre Abfrage 240 Zeichen überschreitet – was ziemlich wahrscheinlich ist, es sei denn, es ist ohnehin trivial genug, um es zu wiederholen – werden Sie auf etwas wie das folgende stoßen:

string beginning "'SELECT * ..." is too long. maximum size is 240 characters.

Sowohl SQL*Plus als auch SQL Developer ermöglichen es Ihnen, eine Substitutionsvariable aus einer Abfrage festzulegen, indem Sie die column ... new_value Befehl :

column tempalias new_value tempview_query
set termout off

select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;

set termout on

Die Abfrage wählt den Text Ihrer Ansichtsabfrage als Zeichenfolge aus; Ich habe den alternativen Zitiermechanismus verwendet , mit [] als Trennzeichen, sodass Sie in der Ansichtsabfrage keine einfachen Anführungszeichen maskieren müssen. (Sie müssen natürlich auch ein Trennzeichen auswählen, das nicht in der Abfrage erscheinen kann). Beachten Sie auch, dass Sie das Zeilenfortsetzungszeichen nicht mehr benötigen.

Das von der Abfrage generierte Textliteral wird als tempalias aliasiert . Die column Befehl setzt die tempview_query Substitutionsvariable zu dem, was dieser Alias-Spaltenausdruck enthält. Die Verwendung der Substitutionsvariablen ist dann die gleiche wie in den vorherigen Beispielen.

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

Der set termout Zeilen verbergen nur diese generierende Abfrage; Sie können off vorübergehend weglassen Zeile, um zu sehen, was die Abfrage erzeugt und ob sie genau mit der erwarteten Ansichtsabfrage übereinstimmt.

Andere Clients haben vielleicht ähnliche Mechanismen, aber das sind die einzigen beiden, mit denen ich wirklich vertraut bin. Ich sollte wahrscheinlich auch wiederholen, dass dies ein kleiner Hack ist und nicht etwas, das ich unbedingt empfehlen würde ...