我正在尝试编写一个收集所有给定文件数据的过程。 我希望该过程用于多个文件。 您应该能够为程序提供任意数量的文件,例如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'。所以,这没有任何回报。
有办法做到这一点吗?
答案 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)否则