在Oracle嵌套表中查找特定的varchar

And*_*ndy 8 oracle plsql oracle10g

我是PL-SQL的新手,并且努力寻找明确的操作文档是嵌套表.请更正任何误用的术语等.

我有一个嵌套的表类型,我用它作为存储过程的参数.

CREATE OR REPLACE TYPE "STRARRAY" AS TABLE OF VARCHAR2 (255)
Run Code Online (Sandbox Code Playgroud)

在我的存储过程中,表被初始化并填充.假设我有一个VARCHAR2变量,如果嵌套表中存在varchar,我想知道true或false.

我试过了

strarray.exists('somevarchar')
Run Code Online (Sandbox Code Playgroud)

但我得到一个ORA-6502

除了迭代之外,还有更简单的方法吗?

FOR i IN strarray.FIRST..strarray.LAST
    LOOP
        IF strarray(i) = value THEN
            return 1;--found
        END IF;
    END LOOP;
Run Code Online (Sandbox Code Playgroud)

zep*_*zep 9

对于单值检查,我更喜欢"成员"运算符.

zep@dev> declare
      2      enames     strarray;
      3      wordToFind varchar2(255) := 'King';
      4  begin
      5      select emp.last_name bulk collect
      6      into   enames
      7      from   employees emp;
      8      if wordToFind member of enames then
      9          dbms_output.put_line('Found King');
     10      end if;
     11  end;
     12  /

Found King

PL/SQL procedure successfully completed

zep@dev> 
Run Code Online (Sandbox Code Playgroud)


Jus*_*ave 5

您可以使用MULTISET INTERSECT运算符来确定您感兴趣的字符串是否存在于集合中.例如

declare
  l_enames strarray;
  l_interesting_enames strarray := new strarray( 'KING' );
begin
  select ename
    bulk collect into l_enames
    from emp;
  if( l_interesting_enames = l_interesting_enames MULTISET INTERSECT l_enames )
  then
    dbms_output.put_line( 'Found King' );
  end if;
end;
Run Code Online (Sandbox Code Playgroud)

如果字符串"KING"是l_enames集合的元素,将打印出"Found King".