ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 713|回复: 14

ORACLE11G,12C,达梦数据库集合类型的table()操作符对比测试

[复制链接]
认证徽章
论坛徽章:
167
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2017-1-11 17:23 | 显示全部楼层 |阅读模式
闲来无聊,做了个达梦数据库,oracle11g,oracle12c的集合类型使用table操作符的功能性对比测试。
个人习惯,喜欢先放结论,初步测试,如有错误,请指出,马上修改。权当newkid大叔今天每日一题的补充好了。

1.object类型测试table(),oracle11g,oracle12c,达梦数据库均通过测试。

  1. create or replace type obj_na as object (id int,name varchar2(20));
  2. create or replace type t_obj_na as table of obj_na;



  3. declare
  4. tbl_t_obj_na t_obj_na;
  5. begin
  6. select obj_na(level,level||'Naldo') bulk collect into tbl_t_obj_na from dual connect by level<=20;
  7. for rec in (select * from table(tbl_t_obj_na)) loop
  8. dbms_output.put_line(rec.name);
  9. end loop;
  10. end;
  11. /
复制代码



2.record类型测试table(),使用关联数组,达梦数据库报"无效的数组查询对象",oracle11g报"循环索引变量 'REC2' 的使用无效",oracle12c通过测试,正常运行出结果。
  1. CREATE OR REPLACE PACKAGE plch_pkg
  2. IS
  3.    type t_rec is record(id int,name varchar2(100));
  4.    TYPE strings_nt IS TABLE OF t_rec;

  5.    TYPE strings_aat IS TABLE OF t_rec
  6.       INDEX BY PLS_INTEGER;

  7. END plch_pkg;
  8. /


  9. declare
  10. tbl_t_rec_na plch_pkg.strings_aat;
  11. begin
  12. FOR REC IN(SELECT LEVEL id,LEVEL||'Naldo' name from dual connect by level<=20) loop
  13. tbl_t_rec_na(rec.id).id:=rec.id;
  14. tbl_t_rec_na(rec.id).name:=rec.name;
  15. end loop;
  16. for rec2 in (select * from table(tbl_t_rec_na) order by id desc) loop
  17. dbms_output.put_line(rec2.name);
  18. end loop;
  19. end;
  20. /
复制代码


3.record类型测试table(),使用嵌套表类型,达梦数据库正常执行出结果,oracle11g报"在 SQL 语句中不允许使用本地收集类型",oracle12c通过测试,正常运行出结果。


  1. CREATE OR REPLACE PACKAGE plch_pkg
  2. IS
  3.    type t_rec is record(id int,name varchar2(100));
  4.    TYPE strings_nt IS TABLE OF t_rec;

  5.    TYPE strings_aat IS TABLE OF t_rec
  6.       INDEX BY PLS_INTEGER;

  7. END plch_pkg;
  8. /


  9. declare
  10. tbl_t_rec_na plch_pkg.strings_nt:=plch_pkg.strings_nt();
  11. begin
  12. FOR REC IN(SELECT LEVEL id,LEVEL||'Naldo' name from dual connect by level<=20) loop
  13. tbl_t_rec_na.extend;
  14. tbl_t_rec_na(rec.id).id:=rec.id;
  15. tbl_t_rec_na(rec.id).name:=rec.name;
  16. end loop;
  17. for rec2 in (select * from table(tbl_t_rec_na) order by id desc) loop
  18. dbms_output.put_line(rec2.name);
  19. end loop;
  20. end;
  21. /
复制代码



4.record类型测试table(),使用数组varray类型,达梦数据库正常执行出结果,oracle11g报"在 SQL 语句中不允许使用本地收集类型",oracle12c通过测试,正常运行出结果。

  1. CREATE OR REPLACE PACKAGE plch_pkg
  2. IS
  3.    type t_rec is record(id int,name varchar2(100));
  4.    TYPE strings_nt IS TABLE OF t_rec;
  5.    type srtings_var is varray(1000) of t_rec;
  6.    TYPE strings_aat IS TABLE OF t_rec
  7.       INDEX BY PLS_INTEGER;
  8.    

  9. END plch_pkg;
  10. /


  11. declare
  12. tbl_t_rec_na plch_pkg.srtings_var:=plch_pkg.srtings_var();
  13. begin
  14. FOR REC IN(SELECT LEVEL id,LEVEL||'Naldo' name from dual connect by level<=20) loop
  15. tbl_t_rec_na.extend;
  16. tbl_t_rec_na(rec.id).id:=rec.id;
  17. tbl_t_rec_na(rec.id).name:=rec.name;
  18. end loop;
  19. for rec2 in (select * from table(tbl_t_rec_na) order by id desc) loop
  20. dbms_output.put_line(rec2.name);
  21. end loop;
  22. end;
  23. /
复制代码
打赏鼓励一下!
认证徽章
论坛徽章:
9
托尼托尼·乔巴
日期:2017-07-18 13:02:53秀才
日期:2015-12-14 14:56:09猴赛雷
日期:2016-01-27 14:16:272016猴年福章
日期:2016-01-27 14:16:27秀才
日期:2016-03-24 09:10:24水瓶座
日期:2016-04-15 16:17:04蒙奇·D·路飞
日期:2017-03-09 11:24:29目光如炬
日期:2017-06-26 17:00:03秀才
日期:2017-07-11 13:54:02
发表于 2017-1-11 19:17 | 显示全部楼层
牛气~
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-1-11 21:52 来自手机 | 显示全部楼层
lz意思是dm相当于11.5

使用道具 举报

回复
认证徽章
论坛徽章:
167
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2017-1-11 22:19 | 显示全部楼层
〇〇 发表于 2017-1-11 21:52
lz意思是dm相当于11.5

按oo的意思理解,这个一晚上就可以兼容,甚至成为13。。。不过无实义,离职了,留给我之前带的小兄弟们一点湿货吧。

使用道具 举报

回复
论坛徽章:
459
探花
日期:2015-08-18 09:50:16秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-1-11 22:41 | 显示全部楼层
据我的测试,12c在关联数组上的TABLE不支持DML,只能够SELECT,你不妨在达梦上面试试:

create table t(id number primary key,val number);

insert into t select level,level from dual connect by level<=10;

create or replace package pkg_test
as
   type t_aat is table of t%rowtype index by pls_integer;
end pkg_test;
/


declare
   v_data pkg_test.t_aat;
begin
   select * bulk collect into v_data from t;
   for lv_rec in (select * from table(v_data)) loop
       dbms_output.put_line('id='||lv_rec.id||' val='||lv_rec.val);
   end loop;
   
   delete t;
   insert into t select * from table(v_data);
end;
/

id=1 val=1
id=2 val=2
id=3 val=3
id=4 val=4
id=5 val=5
id=6 val=6
id=7 val=7
id=8 val=8
id=9 val=9
id=10 val=10
declare
*
ERROR at line 1:
ORA-00902: invalid datatype
ORA-06512: at line 10

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
477
本田
日期:2014-01-05 16:51:44技术图书徽章
日期:2014-04-21 10:26:402014年世界杯参赛球队: 伊朗
日期:2014-05-23 10:41:312014年世界杯参赛球队: 比利时
日期:2014-06-17 12:09:43itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29
发表于 2017-1-12 01:01 | 显示全部楼层
newkid 发表于 2017-1-11 22:41
据我的测试,12c在关联数组上的TABLE不支持DML,只能够SELECT,你不妨在达梦上面试试:

create table t(i ...

从错误 ORA-00902: invalid datatype 来看
似乎有方法可以改写下SQL来避免非法数据类型的出现?

我没环境试不了。

try:
1) insert into t select id, val from (select * from table(v_data));
2)
declare
   v_data pkg_test.t_aat;
   v_data2 pkg_test.t_aat;
begin
   select * bulk collect into v_data2 from t;
   select * bulk collect into v_data from table(v_data2);
   for lv_rec in (select * from table(v_data)) loop
       dbms_output.put_line('id='||lv_rec.id||' val='||lv_rec.val);
   end loop;
end;
/

使用道具 举报

回复
论坛徽章:
459
探花
日期:2015-08-18 09:50:16秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-1-12 01:11 | 显示全部楼层
把列名写出来还是报一样的错。你的匿名块输出如下:

id=1 val=11
id=2 val=2
id=3 val=3
id=4 val=4
id=5 val=5
id=6 val=6
id=7 val=7
id=8 val=8
id=9 val=9
id=10 val=10

PL/SQL procedure successfully completed.

没有环境可以上 livesql.oracle.com测试。

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
477
本田
日期:2014-01-05 16:51:44技术图书徽章
日期:2014-04-21 10:26:402014年世界杯参赛球队: 伊朗
日期:2014-05-23 10:41:312014年世界杯参赛球队: 比利时
日期:2014-06-17 12:09:43itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29
发表于 2017-1-12 01:21 | 显示全部楼层
newkid 发表于 2017-1-12 01:11
把列名写出来还是报一样的错。你的匿名块输出如下:

id=1 val=11

对,这个网址我司微信上还发过,我给忘记 了

使用道具 举报

回复
认证徽章
论坛徽章:
167
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2017-1-12 08:29 | 显示全部楼层
newkid 发表于 2017-1-11 22:41
据我的测试,12c在关联数组上的TABLE不支持DML,只能够SELECT,你不妨在达梦上面试试:

create table t(i ...

到公司我来试试。
来自苹果客户端来自客户端

使用道具 举报

回复
认证徽章
论坛徽章:
167
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2017-1-12 08:29 | 显示全部楼层
lastwinner 发表于 2017-1-12 01:21
对,这个网址我司微信上还发过,我给忘记 了

你boss发的,我看到了。目测你的那个应该可以,直接覆盖。
来自苹果客户端来自客户端

使用道具 举报

回复

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

本版积分规则

SACC2017购票7.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月30日前

活动链接>>
TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表