2016-08-23 37 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; 
    /