Utilisation de variables en PL

bossoax -  
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 :)
Configuration: Windows 2000
Firefox 3.5.6

1 réponse

  1. Moerco-fr Messages postés 5 Statut Membre 3
     
    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