数据库oracle学习之oracle软解析 管道函数 sql返回集合
小职 2020-12-30 来源 :雪夜明月 https://blog.csdn.net/qq_40152902/article/de 阅读 1757 评论 0

摘要:本文主要向大家介绍了数据库oracle学习之oracle软解析 管道函数 sql返回集合,通过具体的内容向大家展现,希望对大家学习数据库oracle有所帮助。

本文主要向大家介绍了数据库oracle学习之oracle软解析 管道函数 sql返回集合,通过具体的内容向大家展现,希望对大家学习数据库oracle有所帮助。

数据库oracle学习之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'));


本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程