将varchar参数传递给procedure

时间:2013-01-24 18:26:30

标签: sql arrays string oracle procedure

我正在尝试编写一个收集所有给定文件数据的过程。 我希望该过程用于多个文件。 您应该能够为程序提供任意数量的文件,例如25,它会收集并收集这些文件的所有数据。

从各个表中收集数据的脚本非常容易编写。其中一个在下面:

     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'。所以,这没有任何回报。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分: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) */用于告诉oracle teh大约行数。最好将其设置为您期望阵列保持的大约数字(因为oracle将默认为卡片猜测为8k)否则