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
注意:变长数组的内容不能直接比较。