ORACLE BLOB-DATEI
Schreibe ich einige pl/sql generieren Sie pdf-reports gespeichert werden als blobs in einer oracle-Tabelle. Ich brauche eine Schleife durch diese Tabelle hat eine Spalte mit dem Namen und der blob und schreiben Sie die blob-Daten in das OS als eine Datei mit dem entsprechenden Dateinamen in der Tabelle. Ich habe so ziemlich abgeschlossen haben, diesen code, aber bin läuft in einen Haken:
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:
Ich habe gelesen, dass die post auf der Website: Wie kann ich Dateien extrahieren aus einer Oracle-BLOB-Feld? - aber - dies ist nur für eine Datei - meine Tabelle enthält mehrere Zeilen, die jeweils einen blob und verbunden mit dem Namen auf der Schleife durch diese Tabelle das er mir Kummer.
Muss ich das Präfix der name des Schemas, der Tabelle und Spalten explizit seit ich angemeldet bin als DBA-Benutzer und nicht als Besitzer des Schemas selbst. Hier ist mein code - was übersehe ich hier oder das falsche tun. Vielen Dank im Voraus für jede Hilfe aus der community - es ist viel geschätzt.
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;
zu beseitigen, die erklärte Notwendigkeit, einschließlich schema in der anonymen block.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, anstelle der Linie 13 mit diesem:
Es wird ein zu spät Antworte, aber zumindest werden Sie wissen, wo haben Sie Fehler gemacht. Das problem ist, wenn Sie verwenden:
FOR X IN (SELECT a, b from table) LOOP
Verwenden Sie
X.a
im next-Anweisungen dieser Schleife richtig zu finden, um die Werte der ausgewählten Zeilen.Also in Ihrem code, den Sie ändern musste
SIMS_PROD.publish_rpt_new.RPT_CONTENTS
zuX.SIMS_PROD.publish_rpt_new.RPT_CONTENTS
.Habe ich nicht Lesen Sie den rest des Codes, also vielleicht könnte es einige mehr Fehler zu.