sqlplus передает строку, содержащую '', такую ​​как 'index1', 'index2', 'index3' - PullRequest
1 голос
/ 16 ноября 2010

Мне нужно передать это значение в мой файл sql, потому что я выполняю условие where с IN.Например: Delete FROM table WHERE col IN ('index1','index2','index3')

У меня проблема при попытке вызвать этот файл sql из cmd с помощью команды sqlplus

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 ]

3 голосов
/ 16 ноября 2010

Oracle не поставляется со встроенным токенайзером строк. Итак, мы должны строить свои собственные. На SO есть несколько разных решений. Вот один из опубликованных мной , который будет работать на 10g или выше. Для более ранних версий попробуйте этот .

1 голос
/ 17 ноября 2010

На самом деле, ваша техника верна.

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)
0 голосов
/ 16 ноября 2010

Я бы посмотрел на это как на переменную в списке вопросов.Это может быть непросто, и ответ варьируется в зависимости от версии 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

...