2017-01-15 139 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提出单个查询,并简化您的工作也是如此。