重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5497|回复: 0
打印 上一主题 下一主题

嵌套表使用集合操作符

[复制链接]
跳转到指定楼层
楼主
发表于 2012-7-29 08:12:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

嵌套表使用集合操作符 -单列或多列均可

 


 嵌套表使用multiset union,multiset except,multiset intersect等使用集合操作符,往往一般都只是对一列进行比较,但是多列实际上也是可以的:

以下介绍中,以multiset except操作符为例。

 


一、只有一列情况下使用集合操作符

由以下1,),2),3),4)说明只有一列的情况下使用集合操作符时既可以直接赋值也可以通过sql语句的形式赋值,但是 2)编译出错,原因是 必须将变量类型定义到schma级别,即要么像3)和4)那样直接在外部定义了一个变量,或者直接在包中的包头进行定义


1)执行成功


 

DECLARE
   TYPE typ_id_table1 IS TABLE OF NUMBER;
   tab_fids1 typ_id_table1 := typ_id_table1();
   tab_fids2 typ_id_table1 := typ_id_table1();
   v_result typ_id_table1;
BEGIN
   v_result := tab_fids1 MULTISET except tab_fids2;
END ;

 

2)执行提示:在SQL语句中不允许使用本地收集类型

DECLARE
   TYPE typ_id_table1 IS TABLE OF NUMBER;
   tab_fids1 typ_id_table1 := typ_id_table1();
   tab_fids2 typ_id_table1 := typ_id_table1();
   v_result typ_id_table1;
BEGIN
   SELECT  tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
 

 

3)编译成功

CREATE OR REPLACE TYPE typ_id_table3 AS TABLE OF NUMBER(10); --在外部定义了变量
DECLARE
   tab_fids1 typ_id_table3 := typ_id_table3();
   tab_fids2 typ_id_table3 := typ_id_table3();
   v_result typ_id_table3;
BEGIN
   v_result := tab_fids1 MULTISET except tab_fids2;
END ;
 

 

4)编译成功

 

CREATE OR REPLACE TYPE typ_id_table3 AS TABLE OF NUMBER(10);--在外部定义变量
DECLARE
   tab_fids1 typ_id_table3 := typ_id_table3();
   tab_fids2 typ_id_table3 := typ_id_table3();
   v_result typ_id_table3;
BEGIN
   SELECT  tab_fids1 MULTISET EXCEPT tab_fids2 INTO v_result FROM DUAL;
END ;
 
 

二、多列情况下使用集合操作符

本以为多列的情况下无法使用集合操作符,再次要感谢itpub newkid版主的解答。

即在使用多列进行比较的时候不能直接比较,而必须改成sql语句的形式进行比较,如下:

 

CREATE OR REPLACE TYPE typ_id_object AS OBJECT (gid NUMBER(10),
                                     gno NUMBER(5),
                                     co NUMBER(5));

CREATE OR REPLACE TYPE typ_id_table AS TABLE OF typ_id_object;
 
 

1)编译成功


DECLARE
   v1 typ_id_table := typ_id_table();
   v2 typ_id_table := typ_id_table();
   v3 typ_id_table;
BEGIN
   SELECT  v1 MULTISET EXCEPT v2 INTO V3 FROM DUAL; --如果是多列的情况下就必须是这种sql语句的形式
END;
 2)
DECLARE
   v1 typ_id_table := typ_id_table();
   v2 typ_id_table := typ_id_table();
   v3 typ_id_table;
BEGIN
   V3 := v1 MULTISET EXCEPT v2; --如果采用此种形式则会提示:PLS-00306:调用 'MULTISET_EXCEPT_ALL' 时参数个数或类型错误

END;
 

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-4-25 18:52 , Processed in 0.105629 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表