PLSQL STORED PROCEDURE没有给出结果

时间:2018-07-30 06:18:57

标签: plsql plsqldeveloper

select count(*) 
INTO countExceed 
from uid_emp_master k 
where k.unique_id in (select k.reviewer_uid 
                      from uid_rm_hierarchy k 
                      where k.unique_id in ('||p_ID_list||')) 
                      and k.band IN( 'A','B','C','D');

if (countExceed > 0) then 
    quer :='UPDATE UID_RM_HIERARCHY I 
            SET I.REVIEWER_UID in (SELECT L.REVIEWER_UID 
                                   FROM UID_RM_HIERARCHY L 
                                   WHERE L.UNIQUE_ID  in ('||p_ID_list||') )  
            WHERE I.REVIEWER_UID in('||p_ID_list||') 
            and isdeleted=0';

EXECUTE IMMEDIATE  quer ;
END IF;

上面的存储过程没有显示变量countExceed声明为数字的任何结果,请帮助我更正查询。

1 个答案:

答案 0 :(得分:0)

问题出在 where k.unique_id in ('||p_ID_list||'))

在这里您要查找记录

where unique_id = '||p_ID_list||'

与输入的类型完全相同,但是您需要将该变量作为值列表进行处理。

假设您有一个这样的表

create table tabTest(id) as (
    select 'id1' from dual union all
    select 'id2' from dual union all
    select 'id3' from dual union all
    select 'id4' from dual
)

,您的输入字符串为'id1,id3,1d8';

我看到两种方法来完成您需要的工作;一种是动态SQL,例如:

declare
    vResult     number;
    vList       varchar2(199) := 'id1,id3,1d8';
    vSQL        varchar2(100);
begin
    vSQL := 
    'select count(*)
    from tabTest
    where id in (''' || replace (vList, ',', ''', ''') || ''')';
    --
    execute immediate vSQL into vResult;
    --
    dbms_output.put_line('Result: ' || vResult);
end;    

另一种方法是将字符串分成值列表,然后在IN中简单地使用结果列表。

为此,关于如何在Oracle中拆分以逗号分隔的列表字符串有很多答案。