Oracle x或其他非windows版本)。 然后您可以从那里运行摘录。

Oracle x或其他非windows版本)。 然后您可以从那里运行摘录。,oracle,blob,Oracle,Blob,我们有一个奇怪的例子,它试图处理MAC输出,它只使用CR 我们将一个仅包含CR的文件作为BLOB加载到数据库中,这没问题 当我们试图从BLOB中写出它时,它出现了与您得到的代码相同的错误 解决方案是在插入blob之前将所有CR替换为CR LF 有趣的是,当Oracle写出来时(DB在UNIX上),它只写LF 然后,在交付给用户之前,我们将实际输出文件中的LF替换为CR Oracle 9不再完全受支持。卓越理财支持已结束。感谢您的回复。是的,我想我们可能需要编写一个应用程序来处理导出。我们是一个.

我们有一个奇怪的例子,它试图处理MAC输出,它只使用CR

我们将一个仅包含CR的文件作为BLOB加载到数据库中,这没问题

当我们试图从BLOB中写出它时,它出现了与您得到的代码相同的错误

解决方案是在插入blob之前将所有CR替换为CR LF

有趣的是,当Oracle写出来时(DB在UNIX上),它只写LF


然后,在交付给用户之前,我们将实际输出文件中的LF替换为CR

Oracle 9不再完全受支持。卓越理财支持已结束。感谢您的回复。是的,我想我们可能需要编写一个应用程序来处理导出。我们是一个.NET商店,所以希望ODP.NET能够处理它!否则,我们正在寻找一个Java解决方案。感谢Gary的建议。这是我要调查的事情。。。这只是一个10版还是11版Oracle server正在使用和可用的问题。我怀疑我会被驱使去写一个应用程序。 PROCEDURE blob_to_file ( -- BLOB to be written to file pi_blob IN BLOB, -- Name of Oracle Directory object pi_oracle_directory_name IN VARCHAR2, -- Destination filename pi_file_name IN VARCHAR2 ) IS v_out_file UTL_FILE.FILE_TYPE; v_blob_len INTEGER; v_buffer RAW(32767); v_amount BINARY_INTEGER := 32767; v_pos INTEGER := 1; BEGIN v_out_file := utl_file.fopen( location => pi_oracle_directory_name, filename => pi_file_name, open_mode => 'W', max_linesize => 32767); v_blob_len := dbms_lob.getlength(pi_blob); WHILE (v_pos < v_blob_len) LOOP -- Ensure amount read is not less than remaining BLOB amount IF (v_pos + v_amount) > (v_blob_len + 1) THEN v_amount := v_blob_len - v_pos; END IF; -- Read chunk of BLOB into buffer DBMS_LOB.read( lob_loc => pi_blob, amount => v_amount, offset => v_pos, buffer => v_buffer); -- Output the buffer as raw data into the file stream utl_file.put_raw( file => v_out_file, buffer => v_buffer, autoflush => true); v_pos := v_pos + v_amount; END LOOP; -- Close the file UTL_FILE.FCLOSE(v_out_file); EXCEPTION WHEN OTHERS THEN -- Close the file if something goes wrong. IF UTL_FILE.is_open(v_out_file) THEN UTL_FILE.fclose(v_out_file); END IF; RAISE; END blob_to_file; PROCEDURE archive_letter_table ( -- Name of Oracle Directory object pi_oracle_directory_name IN VARCHAR2 ) IS v_out_filename NVARCHAR2(100); v_blob BLOB; CURSOR letter_cursor IS SELECT letter_id ,template_ref ,rtf ,xml_data ,row_version ,file_name ,document_type ,document ,business_entity_id ,entity_type ,date_created ,sec_function_ref ,user_account_ref ,hsp FROM fusion.lms_letter; BEGIN FOR letter_cursor_row in letter_cursor LOOP IF letter_cursor_row.document IS NOT NULL THEN -- Retrieve BLOB and determine its size v_blob := letter_cursor_row.document; v_out_filename := CAST(letter_cursor_row.letter_id AS VARCHAR2) || '_' || letter_cursor_row.file_name; -- Call procedure to write the BLOB to file FILE_UTILS.blob_to_file(v_blob, pi_oracle_directory_name, v_out_filename); END IF; END LOOP; TRUNCATE fusion.lms_letter; END archive_lms_letter_table; Error starting at line 5 in command: begin fusion.FUSION_ARCHIVE.archive_lms_letter_table('LMS_Letter_Archive_Dir'); end; Error report: ORA-29285: file write error ORA-06512: at "FUSION.FILE_UTILS", line 73 ORA-06512: at "FUSION.FUSION_ARCHIVE", line 59 ORA-06512: at line 2 29285. 00000 - "file write error" *Cause: Failed to write to, flush, or close a file. *Action: Verify that the file exists, that it is accessible, and that it is open in write or append mode.