我需要将此值传递给我的sql文件,因为我正在执行带有IN的where条件。
例如:Delete FROM table WHERE col IN ('index1','index2','index3')
当我尝试使用sqlplus命令从cmd调用此sql文件时出现问题
set INDEXES = 'index1','index2','index3'
sqlplus script %INDEXES%
当我这样做时,只传递index1或存在问题 我试着这样做
set INDEXES = "'index1','index2','index3'"
sqlplus script %~INDEXES%
但也存在问题
这是我的sql:
Delete FROM table WHERE col IN (&1)
你知道我怎么能成功传递我需要的字符串吗? 谢谢
答案 0 :(得分:3)
Oracle没有内置的字符串标记生成器。所以,我们必须建立自己的。 SO上有几种不同的解决方案。 Here is one I published,可以使用10g或更高。对于早期版本,请尝试this one。
答案 1 :(得分:1)
实际上,你的技术是正确的。
sqlplus scott/tiger @script.sql "'index1','index2','index3'"
其中script.sql是:
Delete FROM table WHERE col IN (&1)
将导致&1
逐字替换'index1','index2','index3'
,导致sqlplus执行:
Delete FROM table WHERE col IN ('index1','index2','index3')
我看到的问题是delete语句不以分号结尾,脚本不提交/退出(可能只是在你的帖子中排除了这些)。
因此,如果您的命令行正确插入环境变量,那么
set INDEXES = "'index1','index2','index3'"
sqlplus scott/tiger @script.sql %~INDEXES%
会产生与我评论中第一个命令相同的命令。
使用命令行参数查看sqlplus正在执行的操作的简便方法是,只需将prompt
添加到脚本中delete
行的开头:
prompt Delete FROM table WHERE col IN (&1)
答案 2 :(得分:0)
我会将此视为列表问题中的变量。这些可能很棘手,答案会根据您有权访问的Oracle版本而有所不同
create table aaa(aaa varchar2(50));
insert into aaa values('index1');
insert into aaa values('index2');
insert into aaa values('index3');
insert into aaa values('index4');
insert into aaa values('index5');
declare
pindexes varchar2(100) ;
begin
pindexes := 'index1,index2,index3';
delete aaa where aaa in (
select substr(pindexes,
loc+1,
nvl(
lead(loc) over (order by loc) - loc-1,
length(pindexes) - loc)
)
from (
select distinct (instr(pindexes, ',', 1, level)) loc
from dual
connect by level < length(pindexes)
)
);
end ;
/
select * from aaa;
/
--drop table aaa;
通过这种方式,您只需将字符串传递为'index1,index2,index3'
这应该适用于9i + http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:210612357425