上面说过了,因为查询数据量较大的表时,首次查询,oracle会冲i性能生成解析计划,造成查询超时,那有没有办法,每次使用相同的解析计划,去查询,让oracle由硬解析改为软解析呢?
答案是有的,oracle的存储过程,一次执行完后,会保存到Oracle中,下次执行 Oracle不会重新编译,这样就节省了sql编译的过程;但问题是 我是使用java查询的数据库,每次返回的不是单条数据,而是一个集合,普通的存储过程无法实现(而且存储过程主要用于数据的加工与计算,一般不用来执行select 语句),这让我无从下手。还好公司请来了一位 dba,正好请教了他这个问题,dba也给出了他的方案。
Oracle提供了管道函数的写法,可以支持返回集合,并且查询时,可当做一个表来使用,具体写法如下:
--创建一个包 定义返回类型
create or replace package pkg_tx_opp_info
as
type type_opp_info is record(
tx_dt date,
tx_tm varchar2(8),
curr_type varchar2(3),
acct_bal number(24,6)
)
--定义类型
type type_tmp_table is table of type_opp_info;
--指定包函数
FUNCTION func_opp_info (i_acct varchar2, i_date varchar2);
return type_tmp_table PIPELINED;
END pkg_tx_opp_info;
--创建包函数
create or replace body pkg_tx_opp_info
as
function func_opp_info(i_acct varchar2, i_date varchar2)
return type_tmp_table pipelined --返回类型,与上文一直
as
begin
for cur_1 in
(
--查询语句
select * from table_test
where acct = i_acct
and date_dt= to_date(i_date,'yyyymmdd')
)loop
pipe row (cur_1);--遍历将结果输出至 返回list中
end loop;
return;
end func_opp_info;
end;
--用法
select * from table (pkg_tx_opp_info.func_opp_info('123','20201227'));