Gestion de bases de données

WUC-14 et WUC-12 lors de l'écriture de nombreuses lignes avec CLIENT_TEXT_IO

S'applique à

Oracle Forms - Version 10.1.2 et suivantes
Les informations de ce document s'appliquent à toutes les plateformes.
pertinence vérifiée le 20-June-2007
Pertinence vérifiée le 16-Jul-2012

Symptômes

Lors de l'écriture de plus de 10922 lignes environ dans un fichier texte sur le poste client avec le package "CLIENT_TEXT_IO" de WebUtil, l'erreur suivante apparaît dans la console Java, sans aucune erreur dans Forms :

ERROR>WUC-14 [getFromObjectCache] Object Cache Error: Specified object handle -1 not found in the cache
ERROR>WUC-12 [FileFunctions.put()] Object Cache Error: Object is not the expected BufferedWriter type

Si vous écrivez 10920 lignes ou moins dans le fichier texte avec CLIENT_TEXT_IO.PUT_LINE, tout fonctionne correctement, sans erreur dans la console Java ni dans le formulaire.

Si vous écrivez 10921 ou 10922 lignes dans le fichier texte avec CLIENT_TEXT_IO.PUT_LINE, le formulaire plante avec l'erreur FRM-92101.

Si vous écrivez plus de 10922 lignes dans le fichier texte avec CLIENT_TEXT_IO.PUT_LINE, le ou les blocs de 10923 lignes sont écrasés par le lot de lignes suivant, et la console Java affiche l'erreur mentionnée ci-dessus, sans aucune erreur dans le formulaire.

Cause

Un bogue a déjà été ouvert pour ce problème. Il s'agit du Bug:4726166 - Webutil : Cannot Output Many Lines Using Client_Text_Io.Put_Line .

Il semble que le package "CLIENT_TEXT_IO" de WebUtil écrive dans le fichier texte (sur le poste client) par blocs d'environ 10920 lignes. Ainsi, si plus de 10920 lignes sont écrites, ces lignes sont écrasées par le bloc de lignes suivant.

Solution

Utilisez l'une des deux solutions de contournement suivantes :

  • Écrivez les données voulues dans un fichier texte sur la machine de l'Application Server avec le package "TEXT_IO". Transférez ensuite le fichier texte sur le poste client avec la fonction "WEBUTIL_FILE_TRANSFER.AS_TO_CLIENT".

Ou

  • Ajoutez un synchronize toutes les 10000 lignes écrites dans le fichier texte sur le poste client avec le package "CLIENT_TEXT_IO" de WebUtil. Consultez l'exemple de code suivant :

Remarque : selon le temps d'exécution de votre code et votre environnement, la commande synchronize devra peut-être être exécutée plus ou moins souvent qu'indiqué ici. Dans certains cas, il faudra peut-être l'exécuter toutes les 1000 lignes, voire plus souvent. Comme la commande synchronize peut nuire aux performances, utilisez-la aussi rarement que possible, mais aussi souvent que nécessaire.

declare
   v_errmsg varchar2(300);
   v_Val INTEGER;
   v_Filename  client_text_io.file_type;
   i number := 0;
   CURSOR cur_emp IS
    select rpad(EMPNO,10,' ')|| rpad(ENAME,20,' ') || rpad(JOB,20,' ')|| rpad(MGR,20,' ') ||
    rpad(to_char(HIREDATE,'dd-Mon-yyyy hh24:mi:ss'),25,' ') || rpad(to_char(SAL),10,' ')||
     rpad(to_char(COMM),10,' ') || rpad(to_char(DEPTNO),10,' ') as emp_info
     from emp
     order by empno,mgr,deptno;
begin
  v_filename :=  client_text_io.fopen('C:\all_emps.txt','W');
   FOR v_cursor in cur_emp
   LOOP
      client_text_io.PUT_LINE(v_filename,v_cursor.emp_info);
-- the following 4 lines of code are added as a workaround to the above mentioned bug.
      i := i + 1;
      if mod(i,10000) = 0 then
 synchronize;
     end if;
   END LOOP;
  client_text_io.FCLOSE(V_FilePointer);
EXCEPTION
WHEN OTHERS THEN
     client_text_io.FCLOSE(V_FilePointer);
     v_errmsg  := SQLERRM;
      message('v_errormsg = '||v_errmsg);
END;