2013-11-20 2 views
1

Можно ли использовать динамический SQL в операторе FOR?Как использовать динамический SQL в инструкции цикла FOR?

Я использую цикл FOR для обработки партии записей из инструкции SELECT. Однако, если я хочу, чтобы оператор SELECT, создаваемый во время выполнения, например имя таблицы, может храниться в переменной.

for thisRecord as 
    select myColumn from MyTable --can this be dynamic? 
do 
    ....... 
end for; 

Я хочу что-то вроде следующего

declare myCursor cursor for stmt; 

set dynamicStmt = 'select myColumn from '||varTable; 
prepare stmt from dynamicStmt; 

for thisRecord as myCursor 
do 
    ...... 
end for; 
+0

Не могли бы вы обернуть все выражения cusor/FOR в динамическом sql? Не советовал бы это, но я предполагаю, что это возможность. –

+0

Как часть хранимой процедуры, обязательно (... как еще вы планируете использовать оператор 'FOR'?). Но что вы пытаетесь выполнить? Я немного беспокоюсь каждый раз, когда кто-то хранит имена таблиц для динамических операторов ... –

+0

@ AllanS.Hansen Я думаю, что не могу, поскольку FOR - это некоторые виды логических управляющих операторов, таких как IF..ElSE вместо SQL-операторов. Даже это возможно, коды будут разбросаны. Думаю, поэтому и не советую. –

ответ

1

Вы могли бы просто использовать FETCH в цикле.

+0

Да, я знаю, что может. Я просто хочу знать, может ли цикл FOR также. В любом случае, спасибо. –

+0

@falsetru Я отредактировал, чтобы уточнить, что его можно использовать в качестве решения. ОК? – WarrenT

0

Поскольку никто другой не отвечает на мой вопрос, я думаю, это означает, что невозможно напрямую использовать динамический SQL в операторе FOR.

Однако, как говорят другие, я могу использовать FETCH. Вот еще один сложный метод, который я узнал позже, который работает в моем случае.

Используйте динамический SQL для создания псевдонима для данной таблицы и используйте этот псевдоним в операторе FOR. Единственное, на что вы должны обратить внимание, это убедиться, что псевдоним существует, поэтому процедура может быть скомпилирована.