2016-08-23 66 views
1

我遇到了一个问题。请需要您的专业知识..在pl/sql查询块中传递变量值

PL/SQL块包含可变p_user_id VARCHAR(50)

的值设置为低于值

p_user_id := '101,102,103'; 

我有查询类似下面的PL/SQL块

select Count(*) into v_count 
from users 
where user_id not in (p_user_id); 

每次我调用这个PL/SQL块时,v_count的值都是一样的,即用户表中的记录总数不变。 Not In子句无法正常工作。请帮忙。

+1

'在条款没有按规定sys.DBMS_DEBUG_VC2COLL --collection数据类型” t正常工作“,它可以正常工作。您没有向'in'条款传递值列表,您只传递一个值-''101,102,103'' –

回答

1

使用LIKE字符串比较:

DECLARE 
    p_user_id VARCHAR2(200) := '101,102,103'; 
    v_count INT; 
BEGIN 
    SELECT Count(*) 
    INTO v_count 
    FROM users 
    WHERE ',' || p_user_id || ',' NOT LIKE '%,' || user_id || ',%'; 
END; 
/

使用集合:

CREATE OR REPLACE TYPE intlist IS TABLE OF INT; 
/

DECLARE 
    p_user_id INTLIST := INTLIST(101, 102, 103); 
    v_count INT; 
BEGIN 
    SELECT Count(*) 
    INTO v_count 
    FROM users 
    WHERE user_id NOT MEMBER OF p_user_id; 
END; 
/
+0

谢谢..这两个块工作.. –

1

users表中没有行,其中user_id的值为'101,102,103'。

如果要将字符串拆分为一组单独的值,则必须做的不仅仅是在not in表达式中使用它。

一些可能的方案:

declare 
    p_csvlist varchar2(100) := '2002, 7369, 7499, 7902, 7934'; 
    v_count integer; 
begin 
    select count(*) into v_count 
    from emp e 
    where e.empno in 
      (select extractvalue(xt.column_value,'e') 
      from table(xmlsequence 
        (extract 
        (xmltype('<coll><e>' || replace(p_csvlist,',','</e><e>') || '</e></coll>') 
        , '/coll/*'))) xt); 

    dbms_output.put_line(v_count || ' rows'); 
end; 

或本

declare 
    p_csvlist varchar2(100) := '2002, 7369, 7499, 7902, 7934'; 
    v_count integer; 
begin 
    select count(*) into v_count 
    from emp e 
    where e.empno in 
      (select regexp_substr(p_csvlist, '[^,]+',1,rownum) 
      from dual 
      connect by rownum <= length(p_csvlist) - length(replace(p_csvlist,','))); 

    dbms_output.put_line(v_count || ' rows'); 
end; 

或本(只适用于数值):

declare 
    p_csvlist varchar2(100) := '2002, 7369, 7499, 7902, 7934'; 
    v_count integer; 
begin 
    select count(*) into v_count 
    from emp e 
    where e.empno in 
      (select to_number(xt.column_value) 
      from xmltable(p_csvlist) xt); 

    dbms_output.put_line(v_count || ' rows'); 
end; 

的例子是从我的FAQ文章: www.williamrobertson.net/documents/comma-separated.html

+0

谢谢威廉姆斯..我有其他方法.. –

+0

请避免链接到外部网站(尤其是如果你还没有宣布你的网站属于)。在帖子中包含所有相关信息。 – MT0

+0

好点。从链接页面添加代码示例(来自我自己的网站,如果这就是您的意思)。 –

0

您可以使用Oracle本身

DECLARE 
     p_user_id sys.DBMS_DEBUG_VC2COLL := sys.DBMS_DEBUG_VC2COLL(101, 102, 103); 
     v_count INT; 
    BEGIN 
     SELECT Count(*) 
     INTO v_count 
     FROM users 
     WHERE user_id not in(select * from table(p_user_id)); 
    END; 
    /