【问题标题】:Find specific varchar in Oracle Nested Table在 Oracle 嵌套表中查找特定的 varchar
【发布时间】:2011-09-14 23:14:19
【问题描述】:

我是 PL-SQL 的新手,很难找到清晰的操作文档是嵌套表。请更正任何滥用的术语等。

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

CREATE OR REPLACE TYPE "STRARRAY" AS TABLE OF VARCHAR2 (255)

在我的存储过程中,表已初始化并填充。假设我有一个 VARCHAR2 变量,我想知道嵌套表中是否存在该 varchar 是真还是假。

我试过了

strarray.exists('somevarchar')

但我得到一个 ORA-6502

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

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

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案1】:

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

    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> 
    

    【讨论】:

      【解决方案2】:

      您可以使用 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;
      

      如果字符串“KING”是 l_enames 集合的一个元素,将打印出“Found King”。

      【讨论】:

        【解决方案3】:

        您应该将数组索引而不是数组值传递给exists,以防您想确定该元素是否存在于集合中。嵌套表是由整数索引的,因此无法通过字符串引用它们。

        但是,如果您希望通过字符串索引引用数组元素,则可能需要查看关联数组而不是集合。这将如下所示:

        DECLARE
          TYPE assocArray IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100);
          myArray assocArray;
        BEGIN
        
          myArray('foo') := 'bar';
        
          IF myArray.exists('baz') THEN
            dbms_output.put_line(myArray('baz'));
        
          ELSIF myArray.exists('foo') THEN
            dbms_output.put_line(myArray('foo'));
        
          END IF;
        
        END;
        

        基本上,如果您的数组值不同,您可以创建相互引用的成对数组,例如, arr('b') := 'a'; arr('a') := 'b';

        这种技术可以帮助您轻松查找任何元素及其索引。

        【讨论】:

          【解决方案4】:

          当嵌套表被声明为模式级类型时,正如您所做的那样,它可以在任何 SQL 查询中用作表。所以你可以像这样写一个简单的函数:

          CREATE OR REPLACE FUNCTION exists_in( str VARCHAR2, tab stararray)
            RETURN BOOLEAN
            AS
              c  INTEGER;
            BEGIN
              SELECT COUNT(*)
                INTO c
                FROM TABLE(CAST(tab AS strarray))
                WHERE column_value = str;
              RETURN (c > 0);
            END exists_in;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-01-30
            • 2020-02-16
            • 1970-01-01
            • 1970-01-01
            • 2018-04-08
            • 2021-07-23
            • 2016-09-14
            相关资源
            最近更新 更多