2016-08-23 3 views
1

1つの問題が発生しました。pl/sqlクエリブロックに変数値を渡しました

PL/SQLブロックが値

p_user_id := '101,102,103'; 

以下に設定した値変数p_user_idのVARCHAR(50)

が含まれている、私は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データ型を使用することができます正しく働く。それは働くと思われるように働く。あなたは 'in'節に値のリストを渡していません。ちょうど1つの値を渡しています - ' 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

user_idの値が '101,102,103'であるusersテーブルに行がありません。

文字列を別々の値のセットに分割する場合は、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; 

例としては、私のよくある質問の記事からです: www.williamrobertson.net/documents/comma-separated.html

+0

ありがとう、ウィリアムズ..私は他の方法を持っています.. –

+0

あなたはウェブサイトへのあなたの所属を宣言していません)。投稿に関連するすべての情報を含めます。 – MT0

+0

良い点。リンクされたページからのコード例を追加しました(これは私のサイトからのものです)。 –

0

あなたが「doesnの句での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; 
    /
関連する問題