在utl\u file.fopen的“filename”属性中使用select

9ceoxa92  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(294)

我有一个从视图中提取数据并以csv格式存储在光盘上的过程。我希望文件名包含表my\u 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,但是这个错误也是。

lbsnaicq

lbsnaicq1#

是的,您可以声明一个变量,以便在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语句不需要异常处理。

相关问题