4 个答案:
答案 0 :(得分:8)
对于单值检查,我更喜欢“成员”操作符。
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>
答案 1 :(得分: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;
如果字符串“KING”是l_enames集合的元素,
将打印出“Found King”。
答案 2 :(得分: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';
这项技术可以帮助您轻松查找任何元素及其索引。
答案 3 :(得分:3)
当嵌套表被声明为模式级类型时,就像您所做的那样,它可以在任何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;