2010-11-16 41 views
1

我需要将这个值传递给我的sql文件,因为我正在执行where条件和IN。 例如:Delete FROM table WHERE col IN ('index1','index2','index3')sqlplus传递一个包含''的字符串,比如'index1','index2','index3'

我有一个问题,当我尝试用sqlplus命令CMD调用这个SQL文件

set INDEXES = 'index1','index2','index3' 
sqlplus script %INDEXES% 

当我这样做,只是指数1已过或者有问题 我试着要做到这一点

set INDEXES = "'index1','index2','index3'" 
sqlplus script %~INDEXES% 

,但有一个问题太

这里是我的SQL:

Delete FROM table WHERE col IN (&1) 

你有什么想法我可以成功地传递我需要的字符串吗? 谢谢

+0

可能重复使用cfprocparam](http:// stackoverflow。com/questions/2866851/array-or-list-into-oracle-using-cfprocparam) – APC 2010-11-16 14:49:59

回答

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; 

这种方式,您只需在您的字符串传递为“索引1,索引2,INDEX3”

这应该工作9i + http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:210612357425

3

Oracle没有内置字符串标记器。所以,我们必须建立自己的。 SO有几种不同的解决方案。 Here is one I published,这将工作在10克或更高。对于早期版本,请尝试this one

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') 

我看到的是,该问题删除语句不会以分号结尾,并且脚本不会提交/退出(也许这些只是在您的文章中排除)。

因此可以得出,如果你的命令行正确插值环境变量,然后

set INDEXES = "'index1','index2','index3'" 
sqlplus scott/tiger @script.sql %~INDEXES% 

产生相同的命令,如我的评论第一。

一个简单的方法,看看有什么的sqlplus使用命令行参数做的是简单地添加prompt到脚本中delete行的开头:

prompt Delete FROM table WHERE col IN (&1) 
[数组或列表到Oracle的
+0

我不认为这是一个安全的实现。你正打开自己的SQL注入痛苦的整个世界! – diagonalbatman 2011-09-06 10:00:16

+0

@diagonalbatman:将参数传递给sqlplus将始终倾向于SQL注入,因为sqlplus只是将字符串替换为其他字符串(没有办法使用带参数的绑定)。 SQL * Plus是应该用于简单的任务,如批处理作业,但从来没有处理用户开关输入:) – 2011-09-06 10:09:44

+0

工具@Vincent非常真实;-)但是大家都知道这些事情如何演变!你不会相信我有多少次碰到过为“简单”工作而设计的东西,并且已经适应了很多东西!有很多方法可以更好地处理这个问题 - 例如,您可以将这些传递给PL/SQL脚本,然后在运行任何内容之前验证并清理输入 - 因此不会直接注入SQL语句 – diagonalbatman 2011-09-06 10:25:00

相关问题