it-swarm-fr.com

Référencer les variables Pl / SQL en boucle

J'ai écrit un script PL/SQL pour trouver la taille d'une longue colonne dans une table. Juste pour rendre le script générique, je passe le nom de la table et le nom de la colonne en tant que variables, mais je reçois une erreur disant que la table ou la vue n'existe pas. Les détails sont:

ORA-06550: line 8, column 34:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 8, column 11:
PL/SQL: SQL Statement ignored
ORA-06550: line 9, column 42:
PLS-00364: loop index variable 'J' use is invalid
ORA-06550: line 9, column 3:
PL/SQL: Statement ignored

Le script est:

declare
a number := 0;
x number := 0;
i number := 0;
tablename varchar2(100):= 'FILES';
columnname varchar2(100):= 'FILESIZE';
begin
for  j in (select columnname from tablename) loop
  a:=UTL_RAW.LENGTH (UTL_RAW.CAST_TO_RAW(j.columnname));
    i := i+1;
dbms_output.put_line(i);
  x:= x + a;
end loop;
dbms_output.put_line(x);
end;

Le nom de la table est des fichiers. Et le nom de la colonne est FILSUISISÉ.

Pouvez-vous suggérer ce que je fais mal. Et que puis-je faire pour trouver la taille de la longue colonne ??

Merci.

4
Egalitarian

L'erreur de votre script est que le script attend maintenant une table nommée Namedame, ayant une colonne nommée colleName. Dans ce cas, vous ne connaissez pas les noms de table et de colonne, vous devez donc utiliser SQL dynamique pour exécuter ceci. À côté de cela, si possible, oubliez à bout de long et implémentez des lobes à la place.

Pour Docu, voir http://download.oracle.com/docs/cd/b28359_01/AppDev.111/b28370/dynamic.htm#i13057

exemple de code légèrement modifié pour répondre à vos besoins:

decLARE
  TYPE EmpCurTyp  IS REF CURSOR;
  v_emp_cursor    EmpCurTyp;
  v_stmt_str      VARCHAR2(200);
  z               long;
  x               number := 0;
  a               number;
  tablename       varchar2(100):= 'dba_views';
  columnname       varchar2(100):= 'text';
BEGIN
  -- Dynamic SQL statement
  v_stmt_str := 'SELECT '||columnname||' from '||tablename;
  -- Open cursor
  OPEN v_emp_cursor FOR v_stmt_str;
  -- Fetch rows from result set one at a time:
  LOOP
      FETCH v_emp_cursor INTO z;
      EXIT WHEN v_emp_cursor%NOTFOUND;
      a:=UTL_RAW.LENGTH (UTL_RAW.CAST_TO_RAW(z));
      x:= x+a;
  END LOOP;
  -- Close cursor:
  CLOSE v_emp_cursor;
  dbms_output.put_line (x);
END;
/
6
ik_zelf