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

Definisci una VIEW in Oracle senza usare CREATE

Ottenere le autorizzazioni corrette e creare oggetti permanenti è l'approccio migliore. Sembra che questa vista verrebbe utilizzata solo in un singolo script, il che non rende necessariamente meno valido la sua creazione, ma potresti trovare più difficile giustificare a seconda del tuo DBA e delle tue politiche. Vale sicuramente la pena provare questo approccio, come suggerito da @DCookie.

Se ciò non riesce, potrebbero esserci soluzioni alternative hacky, a seconda del client in cui eseguirai questo script.

Ad esempio, in SQL*Plus è possibile abusare di variabili di sostituzione per ottenere qualcosa di simile a quello che descrivi. Questo utilizza il define comando per creare una variabile di sostituzione che contenga la query 'view', quindi utilizza quella variabile all'interno di un WITH clausola. (Non puoi sostituire l'intero with in questo modo, ma forse è comunque più chiaro in questo modo). Ho usato una banale query fittizia:

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;

Quando lo script viene eseguito, l'output prodotto è:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

Ho anche eseguito set verify off per nascondere le sostituzioni, ma accenderlo potrebbe essere istruttivo per vedere cosa sta succedendo.

Notare i trattini alla fine di ogni riga della query; questo è il carattere di continuazione e come define i documenti citano:

quindi la query "nuova" mostrata da set verify on avrà l'intera query di visualizzazione su una singola riga (se la visualizzi). È possibile che con una query sufficientemente lunga tu raggiunga un limite di lunghezza della riga, ma si spera che non raggiunga quel punto (tranne che l'hai fatto; vedi sotto).

Puoi fare la stessa cosa in SQL Developer, ma lì la continuazione deve usare due trattini, quindi:

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

tranne che non è proprio la stessa cosa della continuazione in SQL*Plus; qui la definizione deve terminare con un trattino, ma non viene sostituita nel modo in cui descrivono i documenti SQL*Plus, quindi con un singolo trattino la definizione funziona ma la query finisce per non essere valida. (Almeno nella 4.2.0; forse un bug...) Usando due trattini la definizione multilinea funziona ancora, i trattini rimangono parte della query, ma sono trattati come marcatori di commento; quindi rendono la query sostituita strana (di nuovo, se la visualizzi) ma non smettono di funzionare. Non te ne accorgerai con set verify off a meno che qualcuno non guardi in v$sql .

Se la tua query supera i 240 caratteri, il che è piuttosto probabile a meno che non sia abbastanza banale da ripetere comunque, otterrai qualcosa del tipo:

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

Sia SQL*Plus che SQL Developer consentono di impostare una variabile di sostituzione da una query, utilizzando la colonna column ... new_value comando :

column tempalias new_value tempview_query
set termout off

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

set termout on

La query seleziona il testo della query di visualizzazione come stringa; Ho utilizzato il meccanismo di quotazione alternativo , con [] come delimitatori, quindi non è necessario sfuggire a virgolette singole nella query di visualizzazione. (È necessario selezionare un delimitatore che non può apparire anche nella query, ovviamente). Nota anche che non hai più bisogno del carattere di continuazione della riga.

Il valore letterale di testo generato dalla query è alias come tempalias . La column comando imposta il tempview_query variabile di sostituzione a qualsiasi cosa contenga l'espressione di colonna con alias. L'uso della variabile di sostituzione è quindi lo stesso degli esempi precedenti.

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

Il set termout le righe nascondono semplicemente quella query generatrice; puoi omettere temporaneamente il off riga per vedere cosa produce la query e che corrisponde esattamente alla query di visualizzazione che ti aspettavi.

Altri client potrebbero avere meccanismi simili, ma questi sono gli unici due che conosco davvero. Probabilmente dovrei anche ribadire che questo è un po' un trucco, e non qualcosa che consiglierei necessariamente...