1. 程式人生 > 資料庫 >oracle軟解析 管道函式 sql返回集合

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'));