Sql 在utl_file.fopen的“filename”属性中使用select

Sql 在utl_file.fopen的“filename”属性中使用select,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个从视图中提取数据并以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

我有一个从视图中提取数据并以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;

从MY_时间戳中选择to_charmaxEVENT_TS的部件抛出错误。如何设置此动态文件名属性?也许在程序开始时将其写入某个变量?我尝试使用DEFINE,但也出现了错误。

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

谢谢,它正在编译,尽管当我尝试执行该过程时,它抛出错误ORA-01843:不是有效月份。这可能与我们声明的数据类型有关吗?请您解释一下我的时间戳。事件%type的确切含义是什么?Hi@Limak,对不起,我修复了如果您直接使用SELECT maxEVENT \u ts转换为v\u事件,而不进行字符转换,您可以使用我的时间戳。事件%type表示事件列的类型,可能是datetime,而不显式表示数据类型,但在您的情况下,由于转换,我需要使用字符串数据类型。