最近工作中有用到存儲過程,關於存儲過程其中EXECUTE IMMEDIATE在實際開發中用到的還是比較多的 於是乎就把自己在用到時存在的用法及問題在這里總結一下:
如果在存儲過程中 有需要創建表格 更改表結構等操作的時候 並且在接下去的操作需要用到新的表或者結構等問題的時候 必須要使用EXECUTE IMMEDIATE 去執行SQL語句,否則由於oracle的機制則會提示報錯,表或者表結構未創建或為修改,這里只舉兩個例子,實際運用得根據情況去判斷!
最近的開發過程中也經常使用到執行一個字符串的SQL語句 需要將其插入到一個變量中來,EXECUTE IMMEDIATE 'SELECT T.ID FROM STUDENT T WHERE A.NAME=''小明''' INTO V_ID(已在存儲過程定義的變量名)
這里只是舉例,假如小明只有一個 那個會順利的將值插入到變量中,但如果是該變量存在兩個或以上的值則需要用到
BULK COLLECT INTO 變量名;如果要將插入到多個變量中則在后面累加即可。
這里需要注意的是這個變量名必須是個數組類型,否則編譯無法通過,如果對其循環可以執行相應的操作。
如果語句中需要用到變量則有兩種方法:
方法1:可以拼接字符串類型的SQL語句,如(V_SQL:='SELECT T.ID FROM STUDENT T WHERE A.NAME='|| V_NAME;)。
方法2:使用USING 關鍵字 例如: EXECUTE IMMEDIATE 'SELECT T.ID FROM STUDENT T WHERE A.NAME=:V_NAME' USING '小明' INTO V_ID; 也可以把變量傳過來 這里只舉例
在一些特殊情況也可以通過這些操作來拼接SQL語句,例如限制條件的區分,這樣會使一個SQL語句在不同的場景中有不同的效果,而不只是簡單的用變量來取代的作用,
由於我使用oracle也只有幾個月時間,所以對這個的心得也大概如此了,希望對大家以后的使用會有所幫助。
