2013-11-20 63 views
1

是否可以在FOR語句中使用動態SQL?如何在FOR循環語句中使用動態SQL?

我正在使用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

由於沒有人回答我的問題,我想這意味着在FOR語句中直接使用動態SQL是不可能的。

但正如別人所說,我可以使用FETCH。 這是我後來發現的另一個棘手的方法,適用於我的情況。

使用動態SQL爲給定表創建別名,並在FOR語句中使用此別名。 您應該注意的唯一事情是確保別名存在,以便可以編譯過程。

Create or replace procedure MyProcedure(tableName varchar(50)) 
Begin 
    EXECUTE IMMEDIATE 'Drop alias myAlias'; 
    EXECUTE IMMEDIATE 'Create alias myAlias for '||tableName; 

    for thisRecord as 
    select * from myAlias 
    do 
    ......... 
    end for; 
End