我正在寫一些pl/sql來生成以blob存儲在oracle表中的pdf報告。我需要循環遍歷這個包含文件名和blob列的表,並將blob寫入操作系統,作爲表中相應文件名的文件。我幾乎已經完成了這個代碼,但我遇到了一個障礙:ORACLE BLOB到FILE
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? - 但是 - 這只是一個文件 - 我的表中包含數百行,每行有一個blob和相關的文件名 - 它循環通過這張表讓我感到悲傷。
我需要爲模式名稱,表和列顯式加前綴,因爲我以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;
'alter session set current_schema = sims_prod;'將消除在匿名塊中包含模式的陳述必要性。 –