141.Oracle数据库SQL开发之 集合——使用映射方法比较嵌套表的内容

来源:互联网 发布:手机信号屏蔽器软件 编辑:程序博客网 时间:2024/06/06 00:45

141.Oracle数据库SQL开发之 集合——使用映射方法比较嵌套表的内容

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50180833

在满足下面3个条件时,两个嵌套表才相等:

n  两个嵌套表具有相同的类型

n  两个嵌套表具有相同的行数

n  两个嵌套表的所有元素的值都相同

下面创建一个类型t_address2,包含一个名为get_string的映射函数。

CREATETYPE t_address2 AS OBJECT (

  streetVARCHAR2(15),

  city   VARCHAR2(15),

  state  CHAR(2),

  zip    VARCHAR2(5),

 

  -- declarethe get_string() map function,

  -- whichreturns a VARCHAR2 string

  MAP MEMBER FUNCTION get_string RETURNVARCHAR2

);

/

CREATETYPE BODY t_address2 AS

  -- define theget_string() map function

  MAP MEMBER FUNCTION get_string RETURNVARCHAR2 IS

  BEGIN

    -- return aconcatenated string containing the

    -- zip,state, city, and street attributes

    RETURN zip|| ' ' || state || ' ' || city || ' ' || street;

  ENDget_string;

END;

/

当比较t_address2对象,数据库会自动调用get_string.

例如下:

CREATE TYPE t_nested_table_address2 AS TABLE OFt_address2;

/

CREATETABLE customers_with_nested_table2 (

  id         INTEGER PRIMARY KEY,

  first_nameVARCHAR2(10),

 last_name  VARCHAR2(10),

 addresses  t_nested_table_address2

)

NESTEDTABLE

  addresses

STORE AS

 nested_addresses2;

 

INSERTINTO customers_with_nested_table2 VALUES (

  1, 'Steve','Brown',

 t_nested_table_address2(

   t_address2('2 State Street', 'Beantown', 'MA', '12345'),

   t_address2('4 Hill Street', 'Lost Town', 'CA', '54321')

  )

);

然后查询WHERE子句中包含一个嵌套表。

collection_user@PDB1> selectcn.id,cn.first_name,cn.last_name from customers_with_nested_table2 cn wherecn.addresses=

   t_nested_table_address2(

   t_address2('2 State Street','Beantown','MA','12345'),

   t_address2('4 Hill Street','Lost Town','CA','54321'));

 

         ID FIRST_NAME LAST_NAME

---------- ---------- ----------

          1 Steve     Brown

接下来查询,没有返回行,因为WHERE子句中等于号后面的单个地址只匹配cn.addresses中的一个地址。

collection_user@PDB1> selectcn.id,cn.first_name,cn.last_name from customers_with_nested_table2 cn wherecn.addresses=

   t_nested_table_address2(

  t_address2('4 Hill Street','Lost Town','CA','54321'))

 

no rows selected

在10g或更高版本中,使用SUBMULTISET操作符来检查一个嵌套表的内容是否为另一个嵌套表的子集。

如下:

collection_user@PDB1> select cn.id,cn.first_name,cn.last_namefrom customers_with_nested_table2 cn where t_nested_table_address2(

    t_address2('4 Hill Street','Lost Town','CA','54321')) submultiset ofcn.addresses;

 

         ID FIRST_NAME LAST_NAME

---------- ---------- ----------

          1 Steve     Brown

注意:变长数组的内容不能直接比较。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击