您可以使用动态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提出单个查询,并简化您的工作也是如此。
为什么不能在* SQL *语句中使用'NOT IN' – GurV
将两者结合起来?还有,'IF USER_LIST是NULL THEN'吧? – GurV