2013-06-04 3 views
0

Простой вопрос. Если я пытаюсь создать динамический запрос и запустить его в хранимой процедуре PL/SQL, как мне заключить эту переменную в одинарные кавычки, чтобы она вызывалась правильно?PL/SQL Dynamic Where Clause - Отдельная цитата вокруг динамической строки?

Например:

я сначала объявить переменную для хранения значения столбца курсора в. Я также объявить переменную для динамического запроса:

vTest VARCHAR(200); 
l_cur_string VARCHAR2(128); 

После определения мой курсор, I цикл через него, как так:

For entry in c1 
LOOP 
vTest:= entry.variable; 

l_cur_string := 'SELECT ex1, ex2FROM exTable WHERE col1= || vTest; 
END LOOP; 

Конечно, когда я распечатать динамический запрос, он Безразлично У меня есть одинарные кавычки около vTest. Я попытался добавить их, но ничего не выполнил правильно.

Любая помощь по простому вопросу? Спасибо!

+4

Что вы хотите делать с этими запросами? Редко использовать динамический SQL, чаще всего статический SQL является достаточным. Даже если вам действительно нужно * использовать динамический SQL, вы все равно можете использовать [bind variables] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#BHCGEFCA). Не оставляйте себя открытым для [SQL injection] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#CHDFCHHJ). Опишите свой процесс, чтобы мы могли вам помочь. –

+0

Спасибо. По сути, я составил хранимую процедуру, которая возвращает список пакетных рабочих потоков в том порядке, в котором они выполняются. Теперь, что я пытаюсь сделать, это цикл через эти потоки работы и перекрестные ссылки на них с заданиями, которые они содержат. Нет взаимодействия с этой хранимой процедурой. Тем не менее, я все же думаю, что я буду рассматривать переменные связывания и модифицировать этот код для использования статического SQL. Спасибо за эту ссылку! – TimeBomb006

ответ

7

Двойных одиночные кавычки, которые вы хотите, чтобы появиться в строке:

l_cur_string := 'SELECT ex1, ex2FROM exTable WHERE col1= '''|| vTest || ''''; 

Запомни, однако, что встраивание строки непосредственно в выражении SQL является быстрый путь к эксплойту.

+0

Благодарим за ответ и слово предупреждения. Хотя в этой хранимой процедуре нет действий пользователя, я думаю, что я должен по-прежнему использовать лучшие практики, чтобы избежать развития дурной привычки. – TimeBomb006

1

Попробуйте эти 2 фрагментов

 

    DECLARE @sqlCommand varchar(1000) 
    DECLARE @columnList varchar(75) 
    DECLARE @city varchar(75) 
    SET @columnList = 'CustomerID, ContactName, City' 
    SET @city = '''London''' 
    SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city 
    print @sqlCommand 
    --EXEC (@sqlCommand) 


    DECLARE @sqlCommand nvarchar(1000) 
    DECLARE @columnList varchar(75) 
    DECLARE @city varchar(75) 
    SET @columnList = 'CustomerID, ContactName, City' 
    SET @city = 'London' 
    SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = @city' 
    print @sqlCommand 
    --EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city 

+0

Это неверно Синтаксис Oracle PL/SQL –