PL sql在列表中查找字符串

时间:2014-07-23 09:35:13

标签: sql plsql

我有一个问题,因为在这段代码中,我不知道如何测试一个字符串是否在未初始化的列表中。 代码是这样的:

TYPE t1 IS TABLE OF VARCHAR2(32767)  index by PLS_INTEGER;
v_t1 t1;

WOUT                       varchar2(80)                :='bbbb';
v_t1(1):='bbbb';

if (WOUT member of v_t1  ) then

....

end if;

我不知道如何在plsql中写入wout在v_t1中的条件,因为只有初始化的列表才接受成员。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

随着你已经宣布了这个集合,除了遍历集合以找到你想要的元素之外,没有简单的方法可以做你想要做的事情:

declare 
  TYPE t1 IS TABLE OF VARCHAR2(32767)
    index by PLS_INTEGER;

  v_t1    t1;
  WOUT    VARCHAR2(80) := 'zzzz';
  i       NUMBER;
  bFound  BOOLEAN := FALSE;
BEGIN
  v_t1(0)  := 'aaaa';
  v_t1(1)  := 'bbbb';
  v_t1(2)  := 'cccc';
  v_t1(26) := 'zzzz';

  i := v_t1.FIRST;

  LOOP
    DBMS_OUTPUT.PUT_LINE('i=' || i);

    IF v_t1(i) = WOUT THEN
      bFound := TRUE;
      EXIT;
    END IF;

    i := v_t1.NEXT(i);

    IF i IS NULL THEN
      EXIT;
    END IF;
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('bFound=' || CASE WHEN bFOUND THEN 'TRUE' ELSE 'FALSE' END);
end;

但是 - 如果您更改集合以使其被包含的字符串编入索引,则可以使用EXISTS集合方法更轻松地完成此任务:

declare 
  TYPE T2 IS TABLE OF VARCHAR2(32767)
    INDEX BY VARCHAR2(32767);

  v_t2    t2;
  WOUT    VARCHAR2(80) := 'zzzz';
  i       NUMBER;
  bFound  BOOLEAN;
BEGIN
  v_t2('aaaa') := 'aaaa';
  v_t2('bbbb') := 'bbbb';
  v_t2('cccc') := 'cccc';
  v_t2('zzzz') := 'zzzz';

  bFound := v_t2.EXISTS(WOUT);

  DBMS_OUTPUT.PUT_LINE('bFound=' || CASE WHEN bFOUND THEN 'TRUE' ELSE 'FALSE' END);
END;

有关收集方法can be found here的文档。

分享并享受。

答案 1 :(得分:0)

您可以创建特殊函数来检查此类值是否在集合内。这样的事情:

FUNCTION exist_in_collection( p_table t1, p_text VARCHAR2) RETURN boolean
IS
BEGIN
  IF p_table.LAST IS NULL THEN
     RETURN FALSE;
  ELSE
     FOR i IN p_table.FIRST.. p_table.LAST
     LOOP
        IF p_table(i) = p_text  THEN
          RETURN TRUE;
        END IF;
     END LOOP;

     RETURN FALSE;
  END IF;   
END exist_in_collection;

如果p_table未初始化,则LAST为NULL,您将获得FALSE。然后你可以使用这个函数检查字符串是否在集合内:

  

如果exists_in_collection(p_table,WOUT)那么......结束IF;