oracle 10g中成员的使用方法

How to use member of in oracle 10g

我想检查一个元素是否是 sys.odcinumberlist varray 的成员。

但是没用...

我的代码有什么问题?

DECLARE
  v_list sys.Odcinumberlist := sys.Odcinumberlist( 1, 2, 3, 4 );
BEGIN

  FOR i IN 1..v_list.COUNT LOOP
    dbms_output.put_line( v_list(i) );
  END LOOP;

  IF 1 MEMBER OF v_list THEN
    dbms_output.put_line( 'yes' );
  ELSE
    dbms_output.put_line( 'no' );    
  END IF;

END;

这段代码抛出的错误是

ORA-06550: line 9, column 6:
PLS-00306: wrong number or types of arguments in call to 'MEMBER OF'
ORA-06550: line 9, column 3:
PL/SQL: Statement ignored

SYS.Odcinumberlist 是 VARRAY,VARRAYS 不支持嵌套 table 的比较。 更多信息在这里 --> https://docs.oracle.com/cd/B12037_01/appdev.101/b10799/adobjcol.htm
您可以为此使用 SQL 和 table 函数。请参阅下面的示例

DECLARE
  v_list sys.Odcinumberlist := sys.Odcinumberlist( 1, 2, 3, 4 );
  v_member_found char(3);
BEGIN

  FOR i IN 1..v_list.COUNT LOOP
    dbms_output.put_line( v_list(i) );
  END LOOP;

  begin
   select 'yes' into v_member_found 
    from table(v_list) 
   where column_value = 1;
  exception
    when no_data_found 
     then v_member_found := 'no';
  end;
  dbms_output.put_line(v_member_found);

END;

或者,您可以遍历集合

DECLARE
  v_list sys.Odcinumberlist := sys.Odcinumberlist( 1, 2, 3, 4 );
  v_member_found boolean := false;
BEGIN

  FOR i IN 1..v_list.COUNT LOOP
    dbms_output.put_line( v_list(i) );
  END LOOP;


  For i in 1..v_list.COUNT LOOP <<SearchLoop>>
    if v_list(i) = 1 then
       dbms_output.put_line('Member exists');
       v_member_found:=true;
       exit;
    end if;
  end Loop SearchLoop;

  if not v_member_found then
    dbms_output.put_line('member does not exist'); 
  end if;

END;

Since SYS.Odcinumberlist is a VARRAY and comparison is not supported. You can go with nested table type as describes below..

SET SERVEROUTPUT ON;
DECLARE
TYPE v_list_tab
IS
  TABLE OF NUMBER;
  v_list v_list_tab:=v_list_tab(1,2,3,4,5);
BEGIN
  FOR i IN 1..v_list.COUNT
  LOOP
    dbms_output.put_line( v_list(i) );
  END LOOP;
  IF 1 MEMBER OF v_list THEN
    dbms_output.put_line( 'yes' );
  ELSE
    dbms_output.put_line( 'no' );
  END IF;
END;