0

別の関数の結果をファイルに書き込む 3 つのプロシージャを含むパッケージを作成する必要があります。関数 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;

その問題で私を助けてください。そして私の英語でごめんなさい:)

よろしく!

4

1 に答える 1

1

注意が必要なのは、関数が弱い ref カーソルを返すことです。関数はクエリの射影を動的に組み立てるため、強力な ref カーソルを使用することはできません。したがって、呼び出しプログラムが結果セットの構造を知る方法はありません。これは、動的 SQL を使用して結果セットを調べ、メタデータを把握する必要があることを意味します。

幸いなことに、Oracle 11g を使用しています。Oracle はメソッド 4 動的 SQL のサポートを導入したため、参照カーソルを DBMS_SQL カーソルに変換できます。 詳細をご覧ください

UTL_FILE を使用してファイルを開いたり閉じたりする方法を既に知っているので、UTL_FILE.PUT() および UTL_FILE.NEW_LINE() を使用して列を書き出す方法を知っていると思います。

于 2013-07-30T08:51:49.220 に答える