oracle软解析 管道函数 sql返回集合

上面说过了,因为查询数据量较大的表时,首次查询,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'));
	
上一篇:20201204-3 opp编程好处与构造函数


下一篇:OPP中级