sqlplus传递一个包含''的字符串,例如'index1','index2','index3'

时间:2010-11-16 10:44:33

标签: oracle sqlplus tokenize

我需要将此值传递给我的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)

你知道我怎么能成功传递我需要的字符串吗? 谢谢

3 个答案:

答案 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