Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Definir uma VIEW no Oracle sem usar CREATE


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