在 in 子句 TOAD SQL 中使用 varchar 变量

Using a varchar variable within an in clause TOAD SQL

我有一个冗长的查询,其中有很多重复的语句设置国家位置,如 ('GB01','DE01','FR01') 这些在整个过程中重复了 20 多次询问。当需要修改这些时,它很简单,但需要进行大量更改。

我已经将所有其他需要更改的部分都变成了变量,但似乎无法为 in 语句工作。我在这里重新创建了一个较小的示例 - 我知道对于这个示例我可以使用游标/集合来实现相同的结果,但我不相信 cursor/collections 对我的实际用例有用,所以希望对 [=32 有深入了解=] 它可以作为返回变量的 in 语句的一部分工作。

SET FEEDBACK  ON;
set serveroutput on ;
DECLARE
    del_list   varchar(20); 
        BEGIN
    
   sELECT '''AU01'',''DE01'''     INTO del_list      FROM dual; dbms_output.put_line ('del_list: '||del_list);
    delete from kj_temp
    where loc in (to_char(del_list));
    commit;
    dbms_output.put_line ('records deleted: '||sql%rowcount);
    END;

如果我 运行 我的输出显示: del_list: 'AU01','DE01' 删除的记录:0 PL/SQL 程序成功完成。

如果我复制 del_list 内容('AU01'、'DE01')和 运行 脚本,那么所有内容都可以工作,并且 6 行将被删除。

我试过 with/without 和 to_char 并尝试进行一些搜索但无济于事。

如有任何帮助,我们将不胜感激。

这样的方法怎么样?

示例 table 包含员工及其工作:

SQL> create table test as select ename, job from emp;

Table created.

SQL> select job, count(*) from test group by job order by job;

JOB         COUNT(*)
--------- ----------
ANALYST            2
CLERK              3
MANAGER            3
PRESIDENT          2
SALESMAN           4

我想操纵 某些工作 - 文员和经理,所以我会将它们存储到一个集合中。我将使用 Oracle 的内置 sys.odcivarchar2list(如果需要,您可以随时声明自己的)。然后在 where 子句中引用它。在此示例中,我将删除那些 文员和经理 :

SQL> declare
  2    del_list sys.odcivarchar2list;
  3  begin
  4    del_list := sys.odcivarchar2list('CLERK', 'MANAGER');
  5
  6    delete from test
  7      where job in (select * from table(del_list));
  8  end;
  9  /

PL/SQL procedure successfully completed.

结果:

SQL> select job, count(*) from test group by job order by job;

JOB         COUNT(*)
--------- ----------
ANALYST            2
PRESIDENT          2
SALESMAN           4

SQL>

对;不再有文员和经理。


或者,考虑将这些值存储到 table 中。然后将其用作所有查询中的子查询。