2017-01-15 52 views
0

私の問題:ルールをユーザーのテーブルと比較するループを持つpl/sqlパッケージ内で作業しています。私は無効なユーザー(ルールに一致しないユーザー)を取得し、ルールからそれらを除外するSQLクエリ(#2)を作成することができるコンマ区切りの文字列(#1)のリストを構築する必要があります。PLSQLカーソル内にコンマで区切られた文字列リストを生成する

1カンマ区切りのリスト:

Z =表Iは2つのコメント行のいずれかが優れているかどうかわからないのです下のユーザー のメインテーブルとルールを比較した後の結果

declare user_list varchar2(4000) 
IF Z IS NULL THEN 
-- build the comma separated list 
User_list:= --how to buil a list of strings? 
END IF; 

2 SQL文:作成したuser_listを--Using

、今ちょうどメインルールから除外する

IF USER_LIST IS NULL THEN 
'SELECT * FROM RULE WHERE USER NOT IN (:USER_LIST)' 
ELSE 
RETURN RESULT_FROM_RULE; 
END IF; 
+0

「NOT IN」を使用して* SQL *文で2つを組み合わせることはできません – GurV

+0

また、「IF USER_LIST IS NULL THEN'ですか? – GurV

答えて

0

動的SQLを使用して要件を満たすことができます。あなたがそれをやる方法は以下を参照してください。私は、コードの補完のためにコメントをインラインに入れました。

create table table1 (id number, 
        ColumnName varchar2(100)) 

create table table2 (Id  number, 
        col1 varchar2(100), 
        col2 varchar2(100),  
        col3 varchar2(100)); 

Insert all 
    into TABLE1 (ID, COLUMNNAME) Values (1, 'col1') 
    into TABLE1 (ID, COLUMNNAME) Values (2, 'col2') 
    into TABLE2 (ID, col1, col2, col3) Values (1, 'RRR', 'KKK', 'MMM') 
    into TABLE2 (ID, col1, col2, col3) Values (2, 'ZZZ', 'PPP', 'QQQ') 
    into TABLE2 (ID, col1, col2, col3) Values (3, 'LLL', 'NNN', 'DDD') 
select * from dual; 

コード:

DECLARE 
    var  VARCHAR2 (1000); 
    v_sql VARCHAR2 (2000); 
    TYPE x_var IS TABLE OF table2%rowtype ; 
    z_var x_var; 
    num number:=0; 
BEGIN 
    FOR rec IN ( SELECT columnname 
        FROM table1 
      ) 
    LOOP   
     num := num +1;  
     if num = 1 then 
     var:= rec.columnname;  
     else 
     var := var || ' , '|| rec.columnname; 
     end if; 

    END LOOP; 
    ---This is how the comma seperated list is generated. This answers your query `**1 Comma separated list:**` 

    var := RTRIM (LTRIM (var, ','), ','); 

    --This is how you pass the string to your query . This answers your query `**2 SQL statement:**` 

    v_sql := 'select * from table2 where segment1 in ('|| var||')';  

    ---This is how you execute your query. 

    EXECUTE IMMEDIATE v_sql BULK COLLECT INTO z_var; 

    --displaying the result of the query. If you are using a function you can return (z_var). 
    FOR i IN 1 .. z_var.COUNT 
    LOOP 
     DBMS_OUTPUT.put_line (z_var(i).Id ||','||z_var(i).col1); 
    END LOOP; 
END; 

出力:

SQL>/  
1,RRR 
2,ZZZ 
3,LLL 

PL/SQL procedure successfully completed. 

注:GurVによって提案された単一のクエリを使用し、同様にあなたの仕事を簡素化することができますので、予めご了承ください。

関連する問題