Obter as permissões corretas e criar objetos permanentes é a melhor abordagem. Parece que essa exibição só seria usada em um único script, o que não necessariamente torna menos válido criá-la, mas você pode achar mais difícil justificar dependendo do seu DBA e das políticas. Certamente vale a pena tentar essa abordagem, como sugeriu @DCookie.
Se isso falhar, pode haver soluções alternativas, dependendo do cliente em que você executará esse script.
Por exemplo, no SQL*Plus é possível abusar de variáveis de substituição para obter algo próximo ao que você descreve. Isso usa o
define
comando
para criar uma variável de substituição que contém a consulta 'view' e, em seguida, usa essa variável dentro de um WITH
cláusula. (Você não pode substituir todo o with
assim, mas talvez seja mais claro assim de qualquer maneira). Estou usando uma consulta fictícia trivial: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 o script é executado, a saída produzida é:
D
-
X
X
2 rows selected.
D
-
X
X
2 rows selected.
Eu também executei
set verify off
para ocultar as substituições, mas ativá-lo pode ser instrutivo para ver o que está acontecendo. Observe os traços no final de cada linha da consulta; esse é o caractere de continuação , e como
define
documentos mencionam:então a consulta 'nova' mostrada por
set verify on
terá toda a sua consulta de visualização em uma única linha (se você a exibir). É possível que, com uma consulta longa o suficiente, você atinja algum limite de comprimento de linha, mas esperamos que você não atinja esse ponto (exceto que você fez; veja abaixo). Você pode fazer a mesma coisa no SQL Developer, mas lá a continuação precisa usar dois traços, então:
define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'
exceto que não é exatamente o mesmo que a continuação no SQL*Plus; aqui, o define tem que terminar com um traço, mas não é substituído da maneira que os documentos do SQL*Plus descrevem - então, com um único traço, o define funciona, mas a consulta acaba inválida. (Pelo menos na versão 4.2.0; possivelmente um bug...) Usando dois traços, a definição de várias linhas ainda funciona, os traços permanecem parte da consulta, mas são tratados como marcadores de comentários; então eles fazem a consulta substituída parecer estranha (novamente, se você a exibir), mas não a impede de funcionar. Você não notará com
set verify off
a menos que alguém procure em v$sql
. Se sua consulta exceder 240 caracteres - o que é bastante provável, a menos que seja trivial o suficiente para repetir de qualquer maneira - você encontrará algo como:
string beginning "'SELECT * ..." is too long. maximum size is 240 characters.
Tanto o SQL*Plus quanto o SQL Developer permitem que você defina uma variável de substituição de uma consulta, usando a
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
A consulta seleciona o texto de sua consulta de visualização como uma string; Usei o mecanismo de cotação alternativo , com
[]
como os delimitadores, para que você não precise escapar de aspas simples na consulta de exibição. (Você precisa escolher um delimitador que não pode aparecer na consulta também, é claro). Observe também que você não precisa mais do caractere de continuação de linha. O literal de texto que a consulta gera é alias como
tempalias
. A column
comando define o tempview_query
variável de substituição para o que a expressão de coluna com alias contém. Usar a variável de substituição é o mesmo que nos exemplos anteriores. WITH tempview AS (&tempview_query)
SELECT * FROM tempview;
O
set termout
linhas apenas ocultam essa consulta geradora; você pode omitir temporariamente o off
linha para ver o que a consulta produz e que corresponde exatamente à consulta de exibição que você esperava. Outros clientes podem ter mecanismos semelhantes, mas esses são os únicos dois com os quais estou realmente familiarizado. Eu provavelmente também deveria reiterar que isso é um pouco hack, e não algo que eu necessariamente recomendaria ...