oracle軟解析 管道函式 sql返回集合
阿新 • • 發佈:2020-12-28
上面說過了,因為查詢資料量較大的表時,首次查詢,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'));