如何在 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 比较适用于嵌套表而不是 VARRAYs。

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 函数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g正确删除归档日志方法

如何在 Oracle 11g 监听器中启用 SSL

Oracle11g卸载正确步骤,亲测可用

Oracle11g卸载正确步骤,亲测可用

如何使用 SQL*Plus 在 Oracle 11g 中显示数据库

如何在 Oracle 11g 中使用游标在表中插入数据?