2017-01-15 60 views
0

這是我的問題:我正在一個pl/sql包內工作,我有一個將規則與用戶表進行比較的循環。我需要構建逗號分隔的字符串列表(#1),我可以獲取無效用戶(與規則不匹配的用戶),然後創建一個sql查詢(#2)以將其排除在規則之外。PLSQL生成一個用逗號分隔的光標字符串

1逗號分隔列表:

Z =見下表我不知道如果有兩個註釋行是好的規則與用戶 的主表進行比較之後,所獲得

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語句:

--Using創建USER_LIST,現在只是從主規則排除

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

爲什麼不能在* SQL *語句中使用'NOT IN' – GurV

+0

將兩者結合起來?還有,'IF USER_LIST是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提出單個查詢,並簡化您的工作也是如此。