Utilisation de variables en PL
bossoax
-
Moerco-fr Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Moerco-fr Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
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
- Vous avez utilisé ce numéro de téléphone à de trop nombreuses reprises - Forum Gmail
- Dossier en cours d'utilisation - Forum Windows 8 / 8.1
- Cliquez sur ce lien. en n'utilisant que le clavier, quel mot obtenez-vous ? ✓ - Forum souris / Touchpad
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; /