代码之家  ›  专栏  ›  技术社区  ›  Kevin Meredith

了解Oracle函数中的“批量收集”

  •  1
  • Kevin Meredith  · 技术社区  · 6 年前

    给定以下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
    

    或者,换言之,有什么我可以添加到这一行或其他地方来加速查找-也许是索引?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Kaushik Nayak    6 年前

    你所能做的就是用一个选择 MAX COUNT

    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'

    p_id p_category

        2
  •  2
  •   APC    6 年前

    BULK COLLECT

    LIMIT

    Kaushik's solution

        3
  •  0
  •   Alexander    6 年前

    id ROWNUM = 1 WHERE

    FUNCTION foo(p_id NUMBER, p_category VARCHAR) RETURN CHAR IS
    n NUMBER;
    BEGIN
        SELECT id INTO n FROM table WHERE id = p_id AND p_category = 'FOO';
        RETURN 'Y';
    EXCEPTION WHEN OTHERS THEN
        RETURN 'N';
    END;