在 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 中。然后将其用作所有查询中的子查询。
我有一个冗长的查询,其中有很多重复的语句设置国家位置,如 ('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 中。然后将其用作所有查询中的子查询。