首页 > 解决方案 > 了解 Oracle 函数中的“BULK COLLECT”

问题描述

给定以下 Oracle 函数:

CREATE or REPLACE FUNCTION foo(id NUMBER, category VARCHAR) RETURN CHAR IS

TYPE MY_ARRAY2 IS TABLE OF NUMBER;
MY_ARRAY MY_ARRAY2;

BEGIN

   SELECT my_id BULK COLLECT INTO my_array FROM my_table

   RETURN (
            CASE WHEN category = 'FOO' AND (id member of MY_ARRAY)
              THEN 'Y'
              ELSE 'N'
            END
   );
END;

查找的性质是什么:

   SELECT my_id BULK COLLECT INTO my_array FROM my_table

或者,换句话说,有什么我可以添加到这条线或其他地方来加快查找速度 - 也许是一个索引?

标签: sqloracleperformanceplsqlbulk-operations

解决方案


您所能做的就是使用单个选择MAXCOUNT

AS
..
..

v_retval VARCHAR2(10);


SELECT MAX(CASE 
            WHEN category = 'FOO'
                AND id = my_id 
                THEN 'Y'
            ELSE 'N'
            END) INTO v_retval
FROM my_table;
RETURN v_retval;

这取决于字符串 "Y" > "N" 的事实。您也可以使用COUNT(CASE ..另一个案例where count > 1 THEN 'Y'

在 id (或表中引用的其他列)上添加索引将有助于加快查询速度

请注意,最好使用形式的过程参数p_idp_category避免冲突


推荐阅读