Utilisation de variables en PL

Fermé
bossoax - 18 déc. 2009 à 12:47
Moerco-fr Messages postés 5 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 19 décembre 2009 - 19 déc. 2009 à 01:40
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 :)

1 réponse

Moerco-fr Messages postés 5 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 19 décembre 2009 3
19 déc. 2009 à 01:40
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) :

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;
/
0