Oracle
 sql >> Base de données >  >> RDS >> Oracle

Définir une VIEW dans Oracle sans utiliser CREATE

Obtenir les autorisations correctes et créer des objets permanents est la meilleure approche. Il semble que cette vue ne serait utilisée que dans un seul script, ce qui ne la rend pas nécessairement moins valide pour la créer, mais vous pourriez avoir plus de mal à la justifier en fonction de votre DBA et de vos politiques. Cela vaut certainement la peine d'essayer cette approche, comme @DCookie l'a suggéré.

Si cela échoue, il peut y avoir des solutions de contournement, selon le client dans lequel vous exécuterez ce script.

Par exemple, dans SQL*Plus c'est possible abuser des variables de substitution pour obtenir quelque chose de proche de ce que vous décrivez. Cela utilise le define commande pour créer une variable de substitution qui contient la requête 'view', puis utilise cette variable dans un WITH clause. (Vous ne pouvez pas remplacer tout le with comme ça, mais c'est peut-être plus clair comme ça quand même). J'utilise une requête factice triviale :

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;

Lorsque le script est exécuté, la sortie produite est :

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

J'ai également exécuté set verify off pour masquer les substitutions, mais l'activer peut être instructif pour voir ce qui se passe.

Remarquez les tirets à la fin de chaque ligne de la requête ; c'est le caractère de continuation , et comme define la documentation mentionne :

donc la "nouvelle" requête affichée par set verify on aura votre requête de vue entière sur une seule ligne (si vous l'affichez). Il est possible qu'avec une requête suffisamment longue, vous atteigniez une limite de longueur de ligne, mais j'espère que vous n'atteindrez pas ce point (sauf que vous l'avez fait ; voir ci-dessous).

Vous pouvez faire la même chose dans SQL Developer, mais là, la suite doit utiliser deux tirets, donc :

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

sauf que ce n'est pas tout à fait la même chose que la continuation dans SQL*Plus; ici, la définition doit se terminer par un tiret, mais elle n'est pas remplacée de la manière décrite par la documentation SQL * Plus - donc avec un seul tiret, la définition fonctionne mais la requête finit par être invalide. (Au moins en 4.2.0; peut-être un bogue...) En utilisant deux tirets, la définition multiligne fonctionne toujours, les tirets font toujours partie de la requête, mais ils sont traités comme des marqueurs de commentaire; ils donnent donc à la requête substituée un aspect étrange (encore une fois, si vous l'affichez) mais ne l'empêchent pas de fonctionner. Vous ne le remarquerez pas avec set verify off sauf si quelqu'un regarde dans v$sql .

Si votre requête dépasse 240 caractères - ce qui est plutôt probable à moins qu'elle ne soit suffisamment triviale pour être répétée de toute façon - vous obtiendrez quelque chose comme :

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

SQL*Plus et SQL Developer vous permettent tous deux de définir une variable de substitution à partir d'une requête, à l'aide de la column ... new_value commande :

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 requête sélectionne le texte de votre requête de vue sous forme de chaîne ; J'ai utilisé le mécanisme de citation alternatif , avec [] comme délimiteurs, vous n'avez donc pas à échapper les guillemets simples dans la requête de vue. (Vous devez choisir un délimiteur qui ne peut pas non plus apparaître dans la requête, bien sûr). Notez également que vous n'avez plus besoin du caractère de continuation de ligne.

Le littéral de texte généré par la requête est alias tempalias . La column la commande définit le tempview_query variable de substitution à tout ce que cette expression de colonne alias contient. L'utilisation de la variable de substitution est alors la même que dans les exemples précédents.

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

Le set termout les lignes masquent simplement cette requête génératrice; vous pouvez temporairement omettre le off ligne pour voir ce que la requête produit, et qu'elle correspond exactement à la requête de vue que vous attendiez.

D'autres clients peuvent avoir des mécanismes similaires, mais ce sont les deux seuls que je connaisse vraiment. Je devrais probablement aussi répéter que c'est un peu un hack, et pas quelque chose que je recommanderais nécessairement...