2

オラクルテーブルにブロブとして保存されるpdfレポートを生成するために、いくつかのpl/sqlを書いています。ファイル名とブロブの列を持つこのテーブルをループし、テーブル内の対応するファイル名を持つファイルとしてブロブを OS に書き込む必要があります。私はこのコードをほぼ完成させましたが、問題が発生しています:

ORA-06550: line 13, column 59:
PL/SQL: ORA-00904: "SIMS_PROD"."PUBLISH_RPT_NEW"."RPT_FILE_NAME": invalid identifier
ORA-06550: line 13, column 12:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
Cause:    Usually a PL/SQL compilation error.
Action:

サイトの投稿を読みました: How can I extract files from an Oracle BLOB field? -ただし、これは1つのファイルのみです-私のテーブルには、ブロブと関連するファイル名を持つ何百もの行が含まれています-このテーブルをループすると、悲しみが生じます.

スキーマ自体の所有者としてではなく、DBA ユーザーとしてログインしているため、スキーマ名、テーブル、および列に明示的にプレフィックスを付ける必要があります。これが私のコードです-ここで何が欠けているのか、間違っているのか。コミュニティからの支援に感謝します - 大変感謝しています。

DECLARE 
t_blob BLOB; 
t_len NUMBER; 
t_file_name VARCHAR2(100); 
t_output utl_file.file_type; 
t_totalsize NUMBER; 
t_position NUMBER := 1; 
t_chucklen NUMBER := 4096; 
t_chuck RAW(4096); 
t_remain NUMBER; 

BEGIN
  FOR X IN (SELECT SIMS_PROD.publish_rpt_new.RPT_FILE_NAME,     SIMS_PROD.publish_rpt_new.RPT_CONTENTS FROM SIMS_PROD.PUBLISH_RPT)

  LOOP
    -- Get length of blob 
    SELECT dbms_lob.Getlength (SIMS_PROD.publish_rpt_new.RPT_CONTENTS),     SIMS_PROD.publish_rpt_new.RPT_FILE_NAME INTO t_totalsize, t_file_name FROM     SIMS_PROD.publish_rpt_new;
    t_remain := t_totalsize; 

    -- The directory TEMPDIR should exist before executing 
    t_output := utl_file.Fopen ('PDF_REP', t_file_name, 'wb', 32760); 

    -- Get BLOB 
    SELECT SIMS_PROD.publish_rpt_new.RPT_CONTENTS INTO t_blob FROM       SIMS_PROD.publish_rpt_new;

    -- Retrieving BLOB  
    WHILE t_position < t_totalsize 
      LOOP 
        dbms_lob.READ (t_blob, t_chucklen, t_position, t_chuck); 
        utl_file.Put_raw (t_output, t_chuck); 
        utl_file.Fflush (t_output); 
        t_position := t_position + t_chucklen; 
        t_remain := t_remain - t_chucklen; 

        IF t_remain < 4096 THEN t_chucklen := t_remain; 
        END IF; 
      END LOOP; 

    END LOOP;
END;
4

3 に答える 3

0

13 行目を次のように置き換えてみてください。

FOR X IN (SELECT RPT_FILE_NAME, RPT_CONTENTS FROM SIMS_PROD.PUBLISH_RPT)
于 2013-11-20T16:43:36.320 に答える