楼主: 530303869

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

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

那个写法没有体现 动态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
22#
发表于 2017-7-4 14:51 | 只看该作者
530303869 发表于 2017-7-4 14:37
那个写法没有体现 动态sql的作用啊,
我仔细想了 下 感觉是替换变量的问题。


EXECUTE IMMEDIATE 'UPDATE t
                              SET val= upper(val)
                             WHERE ID > :X
                        RETURNING t_obj(id,val) INTO :l_a'
                USING IN X
                RETURNING
                   BULK COLLECT INTO l_a;
  

使用道具 举报

回复
论坛徽章:
0
23#
 楼主| 发表于 2017-7-4 15:23 | 只看该作者
solomon_007 发表于 2017-7-4 14:51
EXECUTE IMMEDIATE 'UPDATE t
                              SET val= upper(val)
                 ...

我 在外面 建了一个 type pp as object  没用 记录数据类型,
ZRH:='&要更新的房屋的自然幢唯一号';
--OPERATION:='&要执行的操作';
  V_SQL :='UPDATE  HHH  SET FH=SUBSTR(MPH,INSTR(MPH,''-'',-1,1)+1) WHERE ZRZID= 1
    RETURNING FWID, HZL,SCJZMJ,MPH,FH    INTO 2';
/*  dbms_output.put_line(V_SQL);
  END;*/
EXECUTE IMMEDIATE V_SQL USING  ZRH
RETURNING BULK COLLECT INTO TB_CS1;
还是报错,表达式类型错误。
这个都困扰好几周了,不晓得问题在哪里

使用道具 举报

回复
论坛徽章:
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
24#
发表于 2017-7-4 16:42 | 只看该作者
530303869 发表于 2017-7-4 15:23
我 在外面 建了一个 type pp as object  没用 记录数据类型,
ZRH:='&要更新的房屋的自然幢唯一号';
  ...

RETURNING FWID, HZL,SCJZMJ,MPH,FH    INTO 2

你这里返回了5个字段,那么 INTO 这个后面就要接5个接收绑定变量的定位符 :1,:2,:3,:4,:5

然后你的 RETURNING BULK COLLECT INTO TB_CS1; 这一句改成

RETURNING BULK COLLECT INTO  l_fwid,l_hzl,l_scjzmj,l_mph,l_fh




如果你觉得这个逐个定义麻烦,再采用对象的方式,对象的方式的重点是,像这样RETURNINGt_obj(id,val)  ,把那几个字段括起来定义在构造函数里

使用道具 举报

回复
论坛徽章:
0
25#
 楼主| 发表于 2017-7-4 17:12 | 只看该作者
solomon_007 发表于 2017-7-4 16:42
RETURNING FWID, HZL,SCJZMJ,MPH,FH    INTO 2

你这里返回了5个字段,那么 INTO 这个后面就要接5个接 ...

这样能得到结果了
EXECUTE IMMEDIATE 'UPDATE  HHH  SET FH=SUBSTR(MPH,INSTR(MPH,''-'',-1,1)+1) WHERE ZRZID= :K1
    RETURNING test_rec(FWID, HZL,SCJZMJ,MPH,FH)    INTO :M1' USING  ZRH
RETURNING BULK COLLECT INTO TB_CS1;
但是把 动态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
26#
发表于 2017-7-4 17:21 | 只看该作者
530303869 发表于 2017-7-4 17:12
这样能得到结果了
EXECUTE IMMEDIATE 'UPDATE  HHH  SET FH=SUBSTR(MPH,INSTR(MPH,''-'',-1,1)+1) WHERE ...

赋值给 一个变量 再执行, test_rec 这个不能用记录,要在SCHEMA下定义 as OBJECT(...)

使用道具 举报

回复
论坛徽章:
0
27#
 楼主| 发表于 2017-7-4 17:25 | 只看该作者
solomon_007 发表于 2017-7-4 17:21
赋值给 一个变量 再执行, test_rec 这个不能用记录,要在SCHEMA下定义 as 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
28#
发表于 2017-7-4 17:28 | 只看该作者
530303869 发表于 2017-7-4 17:25
你前面指出来后,我就去定义了的 但是 就是报错

关于对象处理的情况 14 楼已经模拟的很清楚了,剩下的自己仔细琢磨吧。。。

使用道具 举报

回复
论坛徽章:
0
29#
 楼主| 发表于 2017-7-4 18:25 | 只看该作者
solomon_007 发表于 2017-7-4 17:28
关于对象处理的情况 14 楼已经模拟的很清楚了,剩下的自己仔细琢磨吧。。。

真的非常感谢 你花那么多的时间 为我解答,谢谢!

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
30#
发表于 2017-7-4 23:18 | 只看该作者
530303869 发表于 2017-7-4 17:25
你前面指出来后,我就去定义了的 但是 就是报错

你23楼的RETURNING 后面还是一个一个列分开写,没有调用对象的构建函数。

使用道具 举报

回复

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

本版积分规则 发表回复

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