Base de données -Gérer des variables PL/SQL dans un block WITH en debug
28 août 2016
Petit rappel, la clause WITH permet de créer des sous requêtes. Elle est utilisée pour optimiser le temps d’exécution de la requête.
Elle trouve son intérêt si le WITH est utilisé plusieurs fois par la suite. Oracle prend la décision de créer une table temporaire ou la mettre en mémoire en fonction de la complexité (si trop complexe Oracle utilise la 1ère option).
On peut forcer cette décision en utilisant MATERIALIZE pour stocker les informations dans une table temporaire globale
Quand j'utilise une clause WITH avec des variables à l'intérieur j'aimerai affecter une valeur à ces variables.
Hors mes WITH ne peuvent pas être dans un bloc BEGIN/END, donc pas de DECLARE possible.
Il faut initialiser au préalable la variable
Donc en résumé

Mais comme on initialise son contenu, SqlDeveloper ne nous demande pas d’interaction
blog comments powered by Disqus
WITH ONE AS (
SELECT ...
), TWO AS (
SELECT ..
)
SELECT * FROM ONE
INNER JOIN TWO ...
Elle trouve son intérêt si le WITH est utilisé plusieurs fois par la suite. Oracle prend la décision de créer une table temporaire ou la mettre en mémoire en fonction de la complexité (si trop complexe Oracle utilise la 1ère option).
On peut forcer cette décision en utilisant MATERIALIZE pour stocker les informations dans une table temporaire globale
WITH ART_COUNT AS (
SELECT /*+ MATERIALIZE */
COUNT(*) AS NB_ART
FROM article
)
SELECT ...
ou INLINE pour mettre en mémoireWITH ART_COUNT AS (
SELECT /*+ INLINE */
COUNT(*) AS NB_ART
FROM article
)
SELECT ...
Quand j'utilise une clause WITH avec des variables à l'intérieur j'aimerai affecter une valeur à ces variables.
Hors mes WITH ne peuvent pas être dans un bloc BEGIN/END, donc pas de DECLARE possible.
Il faut initialiser au préalable la variable
DEF myVar = 1337; # Ou remplacer DEF par DEFINE
SELECT &myVar FROM dual
Attention si myVar est une chaine de caractère il faut entourer la variable de simple quoteDEF myVar = 'Content';
DEF myVar ;
>>DEFINE myVar = "Content" (CHAR)
SELECT '&myVar' FROM dual
Donc en résumé
- copiez votre code PL/SQL dans SqlDeveloper
- ajoutez en haut du script l'initialisation des variables
DEF myVar = 'Content'; ...
- ajoutez & devant vos variables (entourez les de simple quote si la variable est une chaine de caractère)
... SELECT '&myVar' FROM ...

Mais comme on initialise son contenu, SqlDeveloper ne nous demande pas d’interaction