ORACLE:写入返回 sys_refcursor 的函数的文件结果

Posted

技术标签:

【中文标题】ORACLE:写入返回 sys_refcursor 的函数的文件结果【英文标题】:ORACLE: write to file result of function that return sys_refcursor 【发布时间】:2013-07-30 07:19:20 【问题描述】:

我必须创建包含三个程序的程序包,这些程序会将另一个函数的结果写入文件。 函数 get_cursor(...) return sys_refcursor 看起来像这样:

function get_cursor(
    tabname in varchar2,
    cols    in array_t,
    vals    in array_t,
    rels    in array_t )
  return sys_refcursor
is
  cur sys_refcursor;
  where_statement varchar2(1000);
  tmp             varchar2(1000);
begin
  if cols.last                     != 0 then
    where_statement                := 'WHERE ' || cols(1) || ' ' || rels(1) || ' ';
    if (rels(1)                     = 'in' or rels(1) = 'not in') then
      where_statement              := where_statement || trim(both '''' from vals(1));
    elsif (utils.is_number(vals(1)) = 'N' and substr( vals(1), 1, 8 ) != 'TO_DATE(') then
      where_statement              := where_statement || '''' || vals(1) || '''';
    else
      where_statement := where_statement || vals(1);
    end if;
    for i in 2..cols.last
    loop
      where_statement                 := where_statement || ' AND ' || cols(i) || ' ' || rels(i) || ' ';
      if (rels(i)                      = 'in' or rels(i) = 'not in') then
        where_statement               := where_statement || trim(both '''' from vals(i));
      elsif ( utils.is_number(vals(i)) = 'N' and substr( vals(i), 1, 8 ) != 'TO_DATE(') then
        where_statement               := where_statement || '''' || vals(i) || '''';
      else
        where_statement := where_statement || vals(i);
      end if;
    end loop;
  end if;
  open cur for 'SELECT * FROM ' || tabname || ' ' || where_statement;
  return cur;
end get_cursor;

它是否正常工作并不重要,它会返回一些东西,我必须将它写入过程中的文件,这将采用与 get_cursor 相同的参数 + 路径和文件名:

procedure txt_export(
    tabname   in varchar2,
    cols      in array_t,
    vals      in array_t,
    rels      in array_t,
    path      in varchar2,
    file_name in varchar2)
is
  l_file utl_file.file_type;
  tmp_file_name varchar2(4000) := file_name;
begin
  if (tmp_file_name like '%.txt') then
    l_file := utl_file.fopen(path, tmp_file_name, 'w');
  elsif (tmp_file_name not like '%.txt') then
    tmp_file_name := tmp_file_name || '.txt';
    l_file        := utl_file.fopen(path, tmp_file_name, 'w');
  end if;

  /*
  run function get_cursor(tabname, cols, vals, rels) and write result to the file .txt
  */

  utl_file.fclose(l_file);
end;

请帮我解决这个问题。 对不起我的英语:)

问候!

【问题讨论】:

【参考方案1】:

棘手的是该函数返回一个弱引用光标;您不能使用强引用游标,因为该函数会动态组合查询的投影。所以调用程序没有办法知道结果集的结构。这意味着您将需要使用动态 SQL 来查询结果集并找出元数据。

幸运的是,您使用的是 Oracle 11g,因为 Oracle 引入了对方法 4 动态 SQL 的支持,它允许我们将 Ref Cursors 转换为 DBMS_SQL 游标。 Find out more。

鉴于您已经知道如何使用 UTL_FILE 打开和关闭文件,我假设您知道如何使用 UTL_FILE.PUT() 和 UTL_FILE.NEW_LINE() 写出列。

【讨论】:

感谢您的回答。这很有帮助。问题解决了。高五!

以上是关于ORACLE:写入返回 sys_refcursor 的函数的文件结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java 中的 oracle SP 返回 sys_refcursor?

Oracle - pl sql 从 SYS_REFCURSOR 中选择

如何在 oracle 中使用 sys_refcursor 创建动态 sql

无法在实体框架中映射 SYS_REFCURSOR

Oracle ref cursor和sys_refcursor

oracle 合并多个sys_refcursor