如何在PL/SQL中使用MEMBER OF

4

我看到过一些这个错误的问题,但是要么是调用外部存储器,要么是尝试使用不兼容的类型或使用 varray。因此,我设置了一个非常简单的例子,但仍然无法使其工作。

DECLARE 
TYPE mytype IS TABLE OF VARCHAR2(4) INDEX BY PLS_INTEGER;
mytable mytype;
BEGIN
  mytable((mytable.COUNT+1)) := 'COD1';
  mytable((mytable.COUNT+1)) := 'COD2';
  mytable((mytable.COUNT+1)) := 'COD3';
  mytable((mytable.COUNT+1)) := 'COD4';  
  --IF 'COD1' MEMBER OF mytable THEN DBMS_OUTPUT.PUT_LINE('We have the code'); END IF;
  FOR i IN 1..mytable.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(mytable(i));
  END LOOP;
END;

如果我运行它,会得到这个:

COD1
COD2
COD3
COD4

如果我取消注释 IF(这是我打算使用的),我会收到此错误。
PLS-00306: wrong number or types of arguments in call to MEMBER OF

也许我没有正确使用它或者出了些问题。 我正试图在循环中使用它,我将已使用的代码保存在“数组”中,然后给定一个代码,我需要知道它是否已经使用过。 我的初步解决方案是将其附加到一个字符串中,如“.COD1..COD2.”,然后进行简单的INSTR,但这似乎不太对,我更喜欢数组。 我听说过那个函数(member of),如果按照我所认为的方式工作,它就能实现我想要的功能。 你能告诉我如何正确使用它,我做错了什么,或者有更好的方法来解决我的问题吗? 快成功了... 我改成了


-- Declare
TYPE mytype IS TABLE OF VARCHAR2(4) INDEX BY VARCHAR(4);
mytable mytype;
-- Fill
mytable('COD1') := 'COD1'; -- kind of redundant I only need the index
-- The magic
IF mytable.EXISTS('COD1')...

但我仍然觉得应该有更好的方法。
2个回答

6
我尝试说明了如何使用嵌套表类型的MEMBER函数。它不能与关联数组一起使用。希望能帮到你。
SET serveroutput ON;
DECLARE
type my_tab
IS
  TABLE OF VARCHAR2(100);
  tab my_tab;
BEGIN
  tab:=my_tab('AVRAJIT','SHUBHOJIT');
  IF 'AVRAJIT' member OF (tab) THEN
    dbms_output.put_line('Yes');
  ELSE
    dbms_output.put_line('No');
  END IF;
END;

它甚至不需要圆括号也能工作: 如果 'AVRAJIT' 是 tab 的成员,则 - Splash

4

MEMBER OF只能在嵌套表中使用。您正在尝试在关联数组上使用它。这里有一个很好的解释区别的链接


哦,我明白了,谢谢。你知道怎么在关联数组中查找元素吗?我试着谷歌了很多东西,但都没有成功。 - Neto Yo
你在上面的编辑中已经完成了。使用mytable.EXISTS。也许你应该定义一下你所说的“更好的方式”。 - DCookie
我的理解是数组的方式是这样的:array[index] = value,所以“更好的方式”应该是查找“值”,而不是“索引”,因为索引本身并不用于存储值。我可能是错的,如果它能工作的话... - Neto Yo
1
你可以为变量赋任何值,例如mytable('COD1'):= 1;并且EXISTS测试仍然可以工作。 - DCookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接