上面說過了,因為查詢資料量較大的表時,首次查詢,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'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/241407.html
標籤:其他
上一篇:資料庫的批量操作
