摘要:本文主要向大家介绍了数据库oracle学习之oracle软解析 管道函数 sql返回集合,通过具体的内容向大家展现,希望对大家学习数据库oracle有所帮助。
本文主要向大家介绍了数据库oracle学习之oracle软解析 管道函数 sql返回集合,通过具体的内容向大家展现,希望对大家学习数据库oracle有所帮助。
上面说过了,因为查询数据量较大的表时,首次查询,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'));
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号