Utilisation de variables en PL
bossoax
-
Moerco-fr Messages postés 5 Statut Membre -
Moerco-fr Messages postés 5 Statut Membre -
Bonjour à tous,
Voici ma requête
DECLARE
v_update VARCHAR2(4000);
v_select VARCHAR2(4000);
compte INTEGER;
BEGIN
FOR tab IN
(
SELECT TABLE_NAME, COLUMN_NAME
FROM USER_TAB_COLUMNS
WHERE DATA_TYPE LIKE '%CHAR%'
ORDER BY TABLE_NAME, COLUMN_NAME
)
LOOP
--SELECT COUNT(1) INTO compte FROM tab.table_name WHERE tab.column_name LIKE '%' || chr(146) || '%';
END LOOP;
END;
Comment puis-je faire pour que les variables tab.table_name et tab.column_name soient interprétées par leur valeurs. avec ce code Oracle me dit table 'tab.table_name' inexistante. Ce qui est normal. Merci :)
Voici ma requête
DECLARE
v_update VARCHAR2(4000);
v_select VARCHAR2(4000);
compte INTEGER;
BEGIN
FOR tab IN
(
SELECT TABLE_NAME, COLUMN_NAME
FROM USER_TAB_COLUMNS
WHERE DATA_TYPE LIKE '%CHAR%'
ORDER BY TABLE_NAME, COLUMN_NAME
)
LOOP
--SELECT COUNT(1) INTO compte FROM tab.table_name WHERE tab.column_name LIKE '%' || chr(146) || '%';
END LOOP;
END;
Comment puis-je faire pour que les variables tab.table_name et tab.column_name soient interprétées par leur valeurs. avec ce code Oracle me dit table 'tab.table_name' inexistante. Ce qui est normal. Merci :)
A voir également:
- Utilisation de variables en PL
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- Cliquez sur ce lien. en n'utilisant que le clavier, quel mot obtenez-vous ? ✓ - Forum souris / Touchpad
- Family link temps d'utilisation ne fonctionne pas - Forum Contrôle parental
- Vous avez utilisé ce numéro de téléphone à de trop nombreuses reprises - Forum Gmail
1 réponse
A partir du moment où les tables et les colonnes sont variables, il faut passer par du SQL dynamique car au moment de la compilation, le parser du PL-SQL ne saura pas vérifier la validité des objets sur lesquels porte la requête.
La solution se trouve à cette adresse (c'est la doc 11g, mais ça reste valable jusqu'à la 8i au moins):
https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057
Ce qui donnerait dans ton cas (pas testé car je n'ai pas de noyau installé sous la main) :
La solution se trouve à cette adresse (c'est la doc 11g, mais ça reste valable jusqu'à la 8i au moins):
https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057
Ce qui donnerait dans ton cas (pas testé car je n'ai pas de noyau installé sous la main) :
declare
cursor crs_tab is
select TABLE_NAME, COLUMN_NAME
from USER_TAB_COLUMNS
where DATA_TYPE like '%CHAR%'
order by TABLE_NAME, COLUMN_NAME;
type crs_compte_typ is REF CURSOR;
crs_compte crs_compte_typ;
v_query VARCHAR2(4000);
compte INTEGER;
begin
for tab in crs_tab loop
v_query := 'select count(1)'
|| ' from '||tab.table_name
||' where '||tab.column_name||' like ''%' || chr(146) || '%''';
open crs_compte for v_query;
fetch crs_compte into compte;
close crs_compte;
end loop;
end;
/