sql >> Databasteknik >  >> RDS >> Oracle

Definiera en vy i Oracle utan att använda CREATE

Att få rätt behörigheter och skapa permanenta objekt är den bästa metoden. Det låter som att den här vyn bara skulle användas i ett enda skript, vilket inte nödvändigtvis gör det mindre giltigt att skapa det, men du kanske tycker att det är svårare att motivera beroende på din DBA och policyer. Det är verkligen värt att prova det tillvägagångssättet, som @DCookie föreslog.

Om det misslyckas kan det finnas hackiga lösningar, beroende på vilken klient du kommer att köra det här skriptet i.

Till exempel i SQL*Plus är det möjligt att missbruka ersättningsvariabler för att få något i närheten av det du beskriver. Detta använder define kommando för att skapa en ersättningsvariabel som innehåller "view"-frågan och sedan använder den variabeln i en WITH klausul. (Du kan inte ersätta hela with så här, men det är kanske tydligare så här ändå). Jag använder en trivial dummy-fråga:

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 skriptet körs är utdata som produceras:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

Jag har också kört set verify off att dölja ersättningarna, men att slå på det kan vara lärorikt för att se vad som händer.

Lägg märke till strecken i slutet av varje rad i frågan; det är fortsättningstecknet , och som define dokument nämner:

så den "nya" frågan som visas av set verify on kommer att ha hela din vyfråga på en enda rad (om du visar den). Det är möjligt att med en tillräckligt lång fråga skulle du nå någon radlängdsgräns, men förhoppningsvis når du inte den punkten (förutom att du gjorde det; se nedan).

Du kan göra samma sak i SQL Developer, men där måste fortsättningen använda två bindestreck, så:

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

förutom att det inte är riktigt samma sak som fortsättningen i SQL*Plus; här måste define sluta med ett bindestreck, men det ersätts inte på det sätt som SQL*Plus-dokumenten beskriver - så med ett enda bindestreck fungerar define men frågan blir ogiltig. (Åtminstone i 4.2.0; möjligen en bugg...) Genom att använda två streck fungerar flerradsdefinitionen fortfarande, strecken förblir en del av frågan, men de behandlas som kommentarsmarkörer; så de får den ersatta frågan att se udda ut (igen, om du visar den) men stoppar den inte att fungera. Du kommer inte att märka det med set verify off om inte någon tittar i v$sql .

Om din fråga överstiger 240 tecken - vilket är ganska troligt om det inte är trivialt nog att upprepas ändå - kommer du att träffa något i stil med:

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

Både SQL*Plus och SQL Developer låter dig ställa in en ersättningsvariabel från en fråga med 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

Frågan väljer texten i din vyfråga som en sträng; Jag har använt den alternativa citeringsmekanismen , med [] som avgränsare, så att du inte behöver undvika några enstaka citattecken i vyfrågan. (Du måste välja en avgränsare som inte kan visas i frågan också, naturligtvis). Observera också att du inte längre behöver linjefortsättningstecknet.

Den bokstavliga texten som frågan genererar har alias som tempalias . column kommandot ställer in tempview_query substitutionsvariabel till vad det aliasade kolumnuttrycket än innehåller. Att använda substitutionsvariabeln är då samma som i de tidigare exemplen.

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

set termout rader döljer bara den genererande frågan; du kan tillfälligt utelämna off rad för att se vad frågan producerar och att den exakt matchar den visningsfråga du förväntade dig.

Andra klienter kan ha liknande mekanismer, men det är de enda två jag är riktigt bekant med. Jag borde nog också upprepa att detta är lite av ett hack, och inte något jag nödvändigtvis skulle rekommendera...



  1. Minsta längdbegränsning på en kolumn

  2. Motsvarighet till GroupBy och Having-klausulen i Relational Algebra

  3. Skillnaden mellan MySQL ÄR INTE NULL och !=''

  4. Oracle SQL escape-tecken (för ett '&')