Bonjour à toutes et tous,
Soit une table FICHIERSPHYS_FIPH comme suit :

FIPH_ID NUMBER(19) NO NO NO NO 3 19 0 1
FIPH_DIS VARCHAR2(11 Byte) NO NO NO NO 12 11 -1 2
CONTENU BLOB NO NO NO NO 2004 4000 -1 3
TAILLE NUMBER(19) NO NO NO NO 3 19 0 4
TYPEMIME VARCHAR2(20 Byte) NO NO NO NO 12 20 -1 5
NOMFICHIER VARCHAR2(50 Byte) NO YES NO NO 12 50 -1 6
EMETTEUR VARCHAR2(6 Byte) NO YES NO NO 12 6 -1 7
FORMATFICHIER VARCHAR2(20 Byte) NO YES NO NO 12 20 -1 8
J'ai donc des blobs, qui sont des fichiers zippés (.zip) que je souhaite récupérer afin de les retraiter (oui, nous avons un problème avec certains d'entre eux).

Pour cela, j'essaie d'utiliser PL/SQL, que je ne maitrise absolument pas.
Voici le contenu de mon script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
DECLARE
  v_start          NUMBER(38,0) := 1;
  v_size  CONSTANT NUMBER( 5,0) := 32000;
  v_len            NUMBER(38,0);
  v_buffer         RAW(32000);
  v_file           UTL_FILE.FILE_TYPE;
BEGIN
  FOR r IN ( SELECT NOMFICHIER, CONTENU FROM FICHIERSPHYS_FIPH )
  LOOP
    v_file  := UTL_FILE.FOPEN(r.NOMFICHIER, 'wb', 32760 );
    v_len   := DBMS_LOB.GETLENGTH( r.CONTENU );
    WHILE v_start <= v_len LOOP
      DBMS_LOB.READ(
        r.CONTENU,
        LEAST( v_len - v_start + 1, v_size ),
        v_start,
        v_buffer
      );
 
      UTL_FILE.PUT_RAW( v_file, v_buffer );
      UTL_FILE.FFLUSH( v_file ); 
      v_start := v_start + v_size;
    END LOOP;
    UTL_FILE.FCLOSE( v_file );
  END LOOP;
END;
/
Hélas, à l'exécution, j'obtiens le message suivant :
start /tmp/plsql_OC242.sql
LEAST( v_len - v_start + 1, v_size ),
*
ERROR at line 15:
ORA-06550: line 15, column 9:
PLS-00363: expression 'LEAST(+(-(V_LEN, V_START), 1), V_SIZE)' cannot be used as an assignment target
ORA-06550: line 13, column 7:
PL/SQL: Statement ignored
Quelques recherches semblent indiquer qu'il s'agirait d'un problème de variable IN/OUT (An IN parameter is writing data to a stored procedure, an OUT parameter is reading data from a stored procedure, and an IN OUT parameter is writing data to and reading data from a stored procedure).
Mais mes essais successifs n'ont pas permis d'aboutir à une solution.

Auriez-vous des indications à me proposer?
Je vous remercie et vous souhaite une bonne journée.
Cordialement,
Thomas