At få de korrekte tilladelser og oprette permanente objekter er den bedste tilgang. Det lyder som om, at denne visning kun ville blive brugt i et enkelt script, hvilket ikke nødvendigvis gør det mindre gyldigt at oprette det, men du kan finde det sværere at retfærdiggøre afhængigt af din DBA og politikker. Det er bestemt værd at prøve den tilgang, som @DCookie foreslog.
Hvis det mislykkes, kan der være hackede løsninger, afhængigt af den klient, du vil køre dette script i.
For eksempel i SQL*Plus er det muligt at misbruge substitutionsvariabler
for at få noget tæt på det, du beskriver. Dette bruger define
kommando
at oprette en substitutionsvariabel, der indeholder 'view'-forespørgslen, og derefter bruge denne variabel i en WITH
klausul. (Du kan ikke erstatte hele with
sådan her, men det er måske klarere sådan alligevel). Jeg er brugt en triviel dummy-forespørgsel:
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;
Når scriptet køres, er outputtet:
D
-
X
X
2 rows selected.
D
-
X
X
2 rows selected.
Jeg har også udført set verify off
at skjule erstatningerne, men at slå det til kan være lærerigt at se, hvad der sker.
Læg mærke til stregerne i slutningen af hver linje i forespørgslen; det er fortsættelseskarakteren
, og som define
dokumenter nævner:
så den 'nye' forespørgsel vist af set verify on
vil have hele din visningsforespørgsel på en enkelt linje (hvis du viser den). Det er muligt, at du med en lang nok forespørgsel ville nå en eller anden linjelængdegrænse, men forhåbentlig når du ikke det punkt (undtagen du gjorde det; se nedenfor).
Du kan gøre det samme i SQL Developer, men der skal fortsættelsen bruge to bindestreger, så:
define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'
bortset fra at det ikke er helt det samme som fortsættelsen i SQL*Plus; her skal define ende med en bindestreg, men den erstattes ikke på den måde, SQL*Plus-dokumenterne beskriver - så med en enkelt bindestreg virker define, men forespørgslen ender med at være ugyldig. (I hvert fald i 4.2.0; muligvis en fejl...) Ved at bruge to bindestreger fungerer multi-line definition stadig, bindestregene forbliver en del af forespørgslen, men de behandles som kommentarmarkører; så de får den erstattede forespørgsel til at se mærkelig ud (igen, hvis du viser den), men stopper den ikke med at virke. Du vil ikke bemærke det med set verify off
medmindre nogen kigger i v$sql
.
Hvis din forespørgsel overstiger 240 tegn - hvilket er ret sandsynligt, medmindre det er trivielt nok til at blive gentaget alligevel - vil du ramme noget som:
string beginning "'SELECT * ..." is too long. maximum size is 240 characters.
Både SQL*Plus og SQL Developer giver dig mulighed for at indstille en substitutionsvariabel fra en forespørgsel ved hjælp af column ... new_value
kommando
:
column tempalias new_value tempview_query
set termout off
select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;
set termout on
Forespørgslen vælger teksten i din visningsforespørgsel som en streng; Jeg har brugt den alternative citeringsmekanisme
, med []
som afgrænsningstegn, så du ikke behøver at undslippe enkelte anførselstegn i visningsforespørgslen. (Du skal selvfølgelig også vælge en afgrænsning, der ikke kan vises i forespørgslen). Bemærk også, at du ikke længere har brug for linjefortsættelsestegnet.
Den bogstavelige tekst, som forespørgslen genererer, er kaldet tempalias
. column
kommandoen indstiller tempview_query
substitutionsvariabel til hvad end det aliaserede kolonneudtryk indeholder. Brug af substitutionsvariablen er så det samme som i de foregående eksempler.
WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
Den set termout
linjer skjuler bare den genererende forespørgsel; du kan midlertidigt udelade off
linje for at se, hvad forespørgslen producerer, og at den nøjagtigt matcher den visningsforespørgsel, du forventede.
Andre klienter kan have lignende mekanismer, men det er de eneste to, jeg virkelig er bekendt med. Jeg skal nok også gentage, at dette er lidt af et hack, og ikke noget, jeg nødvendigvis vil anbefale...