如何在 Oracle 11g 中正确使用 MEMBER OF 函数
Posted
技术标签:
【中文标题】如何在 Oracle 11g 中正确使用 MEMBER OF 函数【英文标题】:How do I properly use the MEMBER OF function in Oracle 11g 【发布时间】:2015-12-08 14:21:29 【问题描述】:我有以下代码,每次执行它时,都会收到错误 PLS-00306:调用“成员”时参数的数量或类型错误。谁能告诉我我是如何错误地使用这个功能的?如果不是,那么正确的使用方法是什么?
如果我正确使用它,我还能如何检查数组的内容?
DECLARE
TYPE type_cd IS VARRAY(12) OF CHAR(2);
v_my_list type_cd ;
v_cd CHAR(2) := 'AA';
BEGIN
v_my_list := type_cd (v_cd);
IF v_cd MEMBER OF v_my_list
THEN
DBMS_OUTPUT.PUT_LINE(v_cd || ' is a member of v_my_list');
ELSE
DBMS_OUTPUT.PUT_LINE(v_cd || ' is NOT a member of v_my_list');
END IF;
END;
【问题讨论】:
【参考方案1】:来自 Oracle 的 Support for Collection Datatypes 页面:
MEMBER [OF]
或NOT MEMBER [OF]
条件测试元素是否是嵌套表的成员,并将结果作为布尔值返回。
MEMBER
比较适用于嵌套表而不是 VARRAY
s。
将VARRAY(12)
更改为TABLE
即可:
DECLARE
TYPE type_cd IS TABLE OF CHAR(2);
v_my_list type_cd ;
v_cd CHAR(2) := 'AA';
BEGIN
v_my_list := type_cd (v_cd);
IF v_cd MEMBER OF v_my_list
THEN
DBMS_OUTPUT.PUT_LINE(v_cd || ' is a member of v_my_list');
ELSE
DBMS_OUTPUT.PUT_LINE(v_cd || ' is NOT a member of v_my_list');
END IF;
END;
编辑:
您可以使用一个简单的循环来检查VARRAY
中是否存在成员:
DECLARE
TYPE type_cd IS VARRAY(12) OF CHAR(2);
v_my_list type_cd ;
v_cd CHAR(2) := 'AA';
v_found BOOLEAN := false;
v_index INTEGER;
BEGIN
v_my_list := type_cd (v_cd);
v_index := v_my_list.FIRST;
WHILE NOT v_found AND v_index IS NOT NULL LOOP
IF v_my_list(v_index) = v_cd THEN
v_found := true;
ELSE
v_index := v_my_list.NEXT( v_index );
END IF;
END LOOP;
IF v_found THEN
DBMS_OUTPUT.PUT_LINE(v_cd || ' is a member of v_my_list at ' || v_index );
ELSE
DBMS_OUTPUT.PUT_LINE(v_cd || ' is NOT a member of v_my_list');
END IF;
END;
【讨论】:
我应该知道 :) 有没有办法以类似的方式检查 VARRAY 的内容? 好的,谢谢,有道理,我希望会有一个预定义的函数。显然循环遍历数组并搜索你的值会给你想要的结果。我只是想避免这种情况:)以上是关于如何在 Oracle 11g 中正确使用 MEMBER OF 函数的主要内容,如果未能解决你的问题,请参考以下文章