Oracle proceduce返回数据集小结

要从Oracle Procedure获得数据集合,通常采用Ref Cursor的方式,要获得此Cursor,有以下几种方式:

1.动态Sql返回:

这种情况下,Procedure的运算通常比较简单,比如根据参数组合sql或者多个Table的Join操作,但都可以通过一个sql语句完成查询。

2.如果Procedure逻辑运算比较复杂,没办法在一个Sql中完成。通常运算过程中需要临时存储中间运算数据等等。
这种情况下,可以采取的方式:
1)使用嵌套表动态产生数据集,并运用Table()函数返回数据集。此种方式需要在DB中创建Object,并要创建嵌套表,
本地作用域中定义的Type不能被识别。
创建Object.

创建嵌套表,类型为上面创建的Object stockPallet_type

 

创建Procedure,输出类型为Sys_refcursor

  

2)另外一种常用的方式就是采用临时表。可以采用动态创建的方式(注:查了一些资料说,尽量避免在procedure中动态创建和删除临时表,但是有一种情况是,临时表的栏位数量是不定的,需要根据逻辑动态生成。这种情况可能用上面的集合比较靠谱?),也可以在创建procedure前就创建好临时表备用(注意跟建立普通表的区别?临时表中数据给当前session<会话级临时表>/transaction<事务级临时表>所有)。注意DDL语句需要用Execute  Immediate语句执行
如果出现“权限不足”的错误,可以考虑用下面的两种方式解决:
1.grant create any table to userName

2.在Oracle的存储过程中,如果涉及到操作不同schema下的对象的时候,可以在不同的schema下写相同的procedure,但这样带来的问题是维护和同步带来了麻烦,可以在procedure中加上authid current_user,来说明procedure中操作的对象是当前连接用户的对象而并不是procedure所属用户下的对象。

1. Create the structure of the global temporary table once, outside of pl/sql.
2. Utilize that table in your procedures. The contents of the table will be local to your session and will automatically disappear when you either log out or commit, depending on how the table is configured.

Multiple sessions can use the same GTT at the same time, but they will not be able to see or interact with each others data. They will also not block each other for any action against that table

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值