2016-04-14 84 views
1

我剛剛開始使用PL/SQL。我的關注如下:本機動態SQL,創建字符串

我想動態地創建一個字符串。

我嘗試了以下操作,但它始終導致ORA-00900 & ORA-06512處於「Execute Immediate ...」行。

這裏,我們去:

Declare 

    l_pre_sql varchar2(4000) := 'schema.'; 
    l_sql varchar2(4000) := 'concat(concat(:a, :b), :c)'; 
    l_after_sql := '.procedure(a,b,c)'; 
begin 

execute immediate l_sql using l_pre_sql, l_sql, l_after_sql; 

end; 

是立即執行錯誤的語法?有沒有其他的工作可能性?如您所見,我正在解決無法使用模式名稱作爲動態變量的問題。

爲了澄清我基本上要做到這一點:提前

execute immediate ':a'||'.'||':b'||'.procedure(a,b,c)' using schema, name; 

謝謝!

+0

你爲什麼不就叫'EXECUTE IMMEDIATE l_pre_sql || l_after_sql'? (concat(schema。,concat(concat(:a,:b),:c),.procedure(a,b,c))',這根本沒有任何意義。 – AndrewMcCoist

+0

模式名稱和變量名稱不能用作綁定變量,它可能類似於eval中的eval。 – ibre5041

回答

1

在預準備語句(使用Oracle和其他語言)中,可以使用參數替換查詢字符串中的常量值。但是,不能替換列名稱,表名稱,用戶(模式),過程名稱等。

換句話說,替換不僅僅是通過用字符串表示替換值。它將參數插入到編譯語句中。

因此,您需要先使用過程名稱構造字符串,然後調用它。

我想你想的是一樣的東西:

execute immediate l_pre_sql || l_after_sql || '(:a, :b, :c)' using . . . 
+0

嗨,首先感謝您的回答。我知道​​,不允許用給定示例替換用戶和過程名稱 我必須承認,我在第一篇文章中弄了一下自己,有點匆忙,請原諒我 我喜歡做的是動態調用一個包含多個包的程序。假設我在每個包中都有一個'Version'過程,現在我想要一個動態的sql語句來替換包名。我可以在這裏使用變量嗎?因爲我所有的嘗試過(以上都是一個壞例子)失敗了。 –