楼主: 530303869

[PL/SQL] 动态 sql 用 bulk collect into 返回多行

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2017-7-4 11:33 | 只看该作者

我想学习下 动态sql 加 returning 返回这种方式的写法,一直写不对

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2017-7-4 11:40 | 只看该作者
solomon_007 发表于 2017-7-4 11:22
静态的DML(楼主的operation是UPDATE ,因为有SET)本身可以带 returning bulk collect into
但这里又 ...

还是 报错。

QQ图片20170704113847.png (52.14 KB, 下载次数: 30)

QQ图片20170704113847.png

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
13#
发表于 2017-7-4 12:44 | 只看该作者
像下面这样分开,不用记录类型,肯定是可以的,只不过要分开定义:

SQL>
SQL> drop table t purge;
Table dropped
SQL> create table t(id int, val varchar2(10));
Table created
SQL> insert into t values (1,'a');
1 row inserted
SQL> insert into t values (2,'b');
1 row inserted
SQL> insert into t values (3,'c');
1 row inserted
SQL> commit;
Commit complete
SQL> DECLARE
  2  
  3    TYPE t_tab   IS TABLE OF t.id%type;
  4    TYPE t_tab2  IS TABLE OF T.VAL%TYPE;
  5    l_a t_tab;
  6    l_b t_tab2;
  7  BEGIN
  8    EXECUTE IMMEDIATE 'UPDATE t
  9                          SET val= upper(val)
10                    RETURNING id,val INTO :l_a,:l_b'
11            RETURNING
12                 BULK COLLECT INTO l_a,l_b;
13  
14    FOR i IN l_a.first .. l_a.last LOOP
15      DBMS_OUTPUT.put_line(l_a(i)||','||l_b(i));
16    END LOOP;
17  
18    COMMIT;
19  END;

20  /
1,A
2,B
3,C
PL/SQL procedure successfully completed

SQL>

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
14#
发表于 2017-7-4 13:01 | 只看该作者
本帖最后由 solomon_007 于 2017-7-4 13:25 编辑

对象类型也支持:
SQL>
SQL>  drop table t purge;
Table dropped
SQL> create table t(id int, val varchar2(10));
Table created
SQL>  insert into t values (1,'a');
1 row inserted
SQL>  insert into t values (2,'b');
1 row inserted
SQL> insert into t values (3,'c');
1 row inserted
SQL>  commit;
Commit complete
SQL>  create or replace type t_obj as object (id2 int,val2 varchar2(10));
  2  

  3  /
Type created

SQL> set serveroutput on;
SQL>
SQL>
SQL>  DECLARE
  2  
  3      TYPE t_tab   IS TABLE OF t_obj;
  4      l_a t_tab;
  5    BEGIN
  6      EXECUTE IMMEDIATE 'UPDATE t
  7                            SET val= upper(val)
  8                      RETURNING t_obj(id,val) INTO :l_a'
  9              RETURNING
10                   BULK COLLECT INTO l_a;
11  
12      FOR i IN l_a.first .. l_a.last LOOP
13        DBMS_OUTPUT.put_line(l_a(i).id2||','||l_a(i).val2);
14      END LOOP;
15  
16      COMMIT;
17    END;
18  /
1,A
2,B
3,C
PL/SQL procedure successfully completed

SQL>



使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
15#
发表于 2017-7-4 13:02 | 只看该作者
本帖最后由 solomon_007 于 2017-7-4 13:27 编辑

刚才的对象定义数据类型搞错了,现在纠正了

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
16#
发表于 2017-7-4 13:02 | 只看该作者
本帖最后由 solomon_007 于 2017-7-4 13:27 编辑

刚才的对象定义数据类型搞错了,现在纠正了

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
17#
发表于 2017-7-4 13:04 | 只看该作者
本帖最后由 solomon_007 于 2017-7-4 13:27 编辑

刚才的对象定义数据类型搞错了,现在纠正了

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
18#
发表于 2017-7-4 13:06 | 只看该作者
本帖最后由 solomon_007 于 2017-7-4 13:27 编辑

刚才的对象定义数据类型搞错了,现在纠正了

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2017-7-4 14:23 | 只看该作者
solomon_007 发表于 2017-7-4 13:06
刚才的对象定义数据类型搞错了,现在纠正了

我不用动态sql 是能得到正确的结果的,  但是 用动态sql 也建了一个 type test_recas object 还是
一直报表达式类型错误。

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
20#
发表于 2017-7-4 14:24 | 只看该作者
530303869 发表于 2017-7-4 14:23
我不用动态sql 是能得到正确的结果的,  但是 用动态sql 也建了一个 type test_recas object 还是
一直 ...

14 楼!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表