首页 > 解决方案 > 在 utl_file.fopen 的 'filename' 属性中使用 select

问题描述

我有一个从视图中提取数据并将其以 CSV 格式存储在磁盘上的过程。我希望文件名包含表 MY_TIMESTAMPS 中的最新时间戳。现在它看起来像这样:

create or replace procedure write_file is
    file_handle UTL_FILE.file_type;
begin
    file_handle := utl_file.fopen('CSV_DIR', 'EXPORT_ABC_'|| (select to_char(max(EVENT_TS)) from MY_TIMESTAMPS) ||'.csv', 'w', 32767);
    for x in (select * from V_MY_VIEW
    loop utl_file.put_line (file_handle, COL1|| ',' ||
                                        COL2|| ',' ||
                                        COL3|| ',' ||
                                        COL4);
    end loop;
    utl_file.fclose(file_handle);
end write_file;

带有的部分(select to_char(max(EVENT_TS)) from MY_TIMESTAMPS)会引发错误。如何设置此动态文件名属性?也许在程序开始时将其写入某个变量?我尝试使用 DEFINE,但也出现了这个错误。

标签: sqloracleplsql

解决方案


是的,您只需声明一个变量,以便在您的 select 语句中使用,并INTO添加一个子句,例如

CREATE OR REPLACE PROCDURE write_file IS
  file_handle utl_file.file_type;
  v_event_ts  varchar2(100);
BEGIN
  SELECT to_char(max(EVENT_TS)) INTO v_event_ts FROM my_timestamps;
  file_handle := utl_file.fopen('CSV_DIR', 'EXPORT_ABC_'||v_event_ts||'.csv', 'w', 32767);
    ......

该 SELECT 语句不需要异常处理。


推荐阅读