sql >> Base de Datos >  >> RDS >> Oracle

Defina una VISTA en Oracle sin usar CREAR

Obtener los permisos correctos y crear objetos permanentes es el mejor enfoque. Parece que esta vista solo se usaría en un solo script, lo que no necesariamente hace que sea menos válido crearlo, pero puede que le resulte más difícil justificarlo según su DBA y sus políticas. Ciertamente vale la pena probar ese enfoque, como sugirió @DCookie.

Si eso falla, puede haber soluciones alternativas, según el cliente en el que ejecutará este script.

Por ejemplo, en SQL*Plus es posible abusar de variables de sustitución para obtener algo cercano a lo que usted describe. Esto usa el define comando para crear una variable de sustitución que contenga la consulta 'vista' y luego use esa variable dentro de un WITH cláusula. (No puede reemplazar todo el with así, pero tal vez sea más claro así de todos modos). Estoy acostumbrado a una consulta ficticia 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;

Cuando se ejecuta el script, la salida producida es:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

También he ejecutado set verify off para ocultar las sustituciones, pero activarlo puede ser instructivo para ver qué está pasando.

Observe los guiones al final de cada línea de la consulta; ese es el carácter de continuación , y como define los documentos mencionan:

por lo que la consulta 'nueva' mostrada por set verify on tendrá su consulta de vista completa en una sola línea (si la muestra). Es factible que con una consulta lo suficientemente larga llegue a algún límite de longitud de línea, pero es de esperar que no llegue a ese punto (excepto que lo hizo; consulte a continuación).

Puede hacer lo mismo en SQL Developer, pero allí la continuación necesita usar dos guiones, entonces:

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

excepto que no es lo mismo que la continuación en SQL*Plus; aquí, la definición tiene que terminar con un guión, pero no se reemplaza de la forma en que se describe en los documentos de SQL*Plus, por lo que con un solo guión, la definición funciona, pero la consulta termina siendo inválida. (Al menos en 4.2.0; posiblemente un error...) Al usar dos guiones, la definición multilínea aún funciona, los guiones siguen siendo parte de la consulta, pero se tratan como marcadores de comentarios; por lo que hacen que la consulta sustituida parezca extraña (nuevamente, si la muestra) pero no dejan de funcionar. No lo notará con set verify off a menos que alguien busque en v$sql .

Si su consulta supera los 240 caracteres, lo cual es bastante probable a menos que sea lo suficientemente trivial como para repetirla de todos modos, obtendrá algo como:

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

Tanto SQL*Plus como SQL Developer le permiten establecer una variable de sustitución a partir de una consulta mediante la 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 consulta selecciona el texto de su consulta de vista como una cadena; He usado el mecanismo de cotización alternativo , con [] como delimitadores, por lo que no tiene que escapar de las comillas simples en la consulta de vista. (Por supuesto, también debe elegir un delimitador que no pueda aparecer en la consulta). También tenga en cuenta que ya no necesita el carácter de continuación de línea.

El literal de texto que genera la consulta tiene un alias como tempalias . La column el comando establece el tempview_query variable de sustitución a lo que sea que contenga esa expresión de columna con alias. El uso de la variable de sustitución es entonces el mismo que en los ejemplos anteriores.

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

El set termout las líneas simplemente ocultan esa consulta generadora; puede omitir temporalmente el off línea para ver qué produce la consulta y que coincide exactamente con la consulta de vista que esperaba.

Otros clientes pueden tener mecanismos similares, pero esos son los únicos dos con los que estoy realmente familiarizado. Probablemente también debería reiterar que esto es un truco, y no es algo que recomendaría necesariamente...