sql >> Database teknologi >  >> RDS >> Oracle

Definer en VIEW i Oracle uden at bruge CREATE

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...



  1. Sådan udføres Stored Procedure fra Laravel

  2. Sådan bruger du match imod i mysql

  3. Hierarkisk tagging i SQL

  4. Hvordan får du den størst mulige dato i Oracle?