0

指定されたすべてのファイルのデータを収集する手順を作成しようとしています。この手順を複数のファイルに使用したい。プロシージャーに任意の数のファイル (たとえば 25 個) を指定できるようにする必要があります。これにより、これらのファイルのすべてのデータが収集されます。

個々のテーブルからデータを収集するスクリプトは、非常に簡単に作成できます。それらの1つは以下のとおりです。

     select * From Table_name a
          Where a.FILE_ID in  pi_fileid 
          and a.FILE_TYPE = 'L';

また、以下に示すようにテストを試みました。

    EXECUTE IMMEDIATE  'select count(*) from Table_name 
                        where file_id in (' || pi_fileid || ')  
                        AND file_type = ''L'' 
                        AND status = ''FP''' INTO cnt;

pi_fileid は、ファイル名を含む varchar です。それらはコンマで区切られます。

私のプロシージャの実行呼び出しは次のようになります。

DECLARE 
  PI_FILETYPE VARCHAR2(200);
  PI_DATE DATE;
  PI_FILEID VARCHAR2(200);

BEGIN 
  PI_FILETYPE := 'BLA_BLA';
  PI_DATE := '30-dec-2009';
  PI_FILEID := (''Z1100E71g'' ,''Y1100E71g'');

  GATHER_PKG.GATHEREFILE ( PI_FILETYPE, PI_DATE, PI_FILEID );
  COMMIT; 
END; 

しかし、サーバーは「Z1100E71g.def」ではなく「Z1100E71g.def」を探していると考えているように見えるため、これはデータベースから何も収集しません。したがって、これは何も返しません。

これを行う方法はありますか?

4

1 に答える 1

0

最善の方法は、SQL 配列を使用することです。

SQL> create type file_id_tab as table of varchar2(20);
  2  /

Type created.

SQL> create or replace package GATHER_PKG
  2  as
  3    procedure gatherfile(pi_filetype table_name.file_type%type,
  4                         pi_date     date,
  5                         pi_fileid   file_id_tab);
  6  end;
  7  /

Package created.

SQL> create or replace  package body GATHER_PKG
  2  as
  3    procedure gatherfile(pi_filetype table_name.file_type%type,
  4                         pi_date     date,
  5                         pi_fileid   file_id_tab)
  6    is
  7      v_cnt number;
  8    begin
  9
 10      select count(*)
 11        into v_cnt
 12        from table_name
 13       where file_id in (select /*+ cardinality(p, 10) */ p.column_value
 14                           from table(pi_fileid) p)
 15         and file_type = pi_filetype
 16         and status = 'FP';
 17
 18      dbms_output.put_line(v_cnt);
 19    end;
 20  end;
 21  /

Package body created.

SQL> DECLARE
  2    PI_FILETYPE VARCHAR2(200);
  3    PI_DATE DATE;
  4    PI_FILEID file_id_tab;
  5
  6  BEGIN
  7    PI_FILETYPE := 'BLA_BLA';
  8    PI_DATE := '30-dec-2009';
  9    PI_FILEID := file_id_tab('Z1100E71g' ,'Y1100E71g');
 10
 11    GATHER_PKG.GATHERFILE ( PI_FILETYPE, PI_DATE, PI_FILEID );
 12    COMMIT;
 13  END;
 14  /
2

PL/SQL procedure successfully completed.

カーディナリティのヒント/*+ cardinality(p, 10) */は、オラクルにおよその行数を伝えるために使用されます。配列が保持すると予想されるおおよその数に設定するのが最善です(それ以外の場合、オラクルはデフォルトで8kのカード推測を行うため)

于 2013-01-24T21:29:35.340 に答える