using comma separated values inside IN clause for NUMBER column

后端 未结 4 1159
情话喂你
情话喂你 2020-12-20 00:21

I have 2 procedures inside a package. I am calling one procedure to get a comma separated list of user ids.

I am storing the result in a VARCHAR variab

4条回答
  •  一整个雨季
    2020-12-20 00:50

    DO NOT USE THIS SOLUTION!

    Firstly, I wanted to delete it, but I think, it might be informative for someone to see such a bad solution. Using dynamic SQL like this causes multiple execution plans creation - 1 execution plan per 1 set of data in IN clause, because there is no binding used and for the DB, every query is a different one (SGA gets filled with lots of very similar execution plans, every time the query is run with a different parameter, more memory is needlessly used in SGA).

    Wanted to write another answer using Dynamic SQL more properly (with binding variables), but Justin Cave's answer is the best, anyway.

    You might also wanna try REF CURSOR (haven't tried that exact code myself, might need some little tweaks):

    DECLARE
        deptId                  NUMBER := 2;
        l_userIds               VARCHAR2(2000) := getUserIds(deptId);
        TYPE t_my_ref_cursor IS REF CURSOR;
        c_cursor                t_my_ref_cursor;
        l_row                   users_Table%ROWTYPE;
        l_query                 VARCHAR2(5000);
    BEGIN
        l_query := 'SELECT * FROM users_Table WHERE user_id IN ('|| l_userIds ||')';
        OPEN c_cursor FOR l_query;
    
        FETCH c_cursor INTO l_row;
        WHILE c_cursor%FOUND
        LOOP
            -- do something with your row
            FETCH c_cursor INTO l_row;
        END LOOP;
    
    END;
    /
    

提交回复
热议问题