每PL/SQL
將執行前先編譯。這裏的編譯涉及PL/SQL結構的語法檢查和對正在使用的SQL的語義檢查。
通過EXECUTE IMMEDIATE運行SQL意味着查詢將被動態解析並執行。然後我們將其命名爲動態 SQL。動態SQL由一個字符串和查詢組成,因此Oracle之前並不知道這些查詢。只有在運行時纔會被編譯和執行。
而在另一種方法中,SQL
在編譯期間被解析用於語義檢查。我們將其稱爲靜態 SQL。在編譯期間,我們得到了所有無效的SQL語句錯誤。
另一個主要的區別是,在PROCEDURE
或FUNCTION
中使用靜態SQL時。 Oracle會創建該表名與Procedure
/function
的依賴關係。你可以在dba_dependencies表中找到它們。
創建這樣的依賴關係非常重要,因爲當表被修改時,如果修改了在函數中引用的列名稱,或者表/視圖/類型本身被刪除,那麼Oracle將使用INVALIDATE
函數。因此,確保我們不會收到意想不到的Exceptions.But DYNAMIC sqls將是完全匿名的,並且不會創建任何依賴關係。您可能會遇到ORA-942 TABLE OR VIEW DOESNOT EXISTS
錯誤,只能使用DYNAMIC sql而不使用靜態SQL,僅僅是因爲這個原因。
下面的查詢會列出(表稱爲交叉模式,沒有架構名稱)的過程或函數稱爲所有表名,無論是作爲一個同義詞和表名直接與架構名稱(或默認模式)
select
proc_syn.referenced_owner,
proc_syn.referenced_name,
proc_syn.referenced_type,
syn_tab.table_name
from
dba_dependencies proc_syn, dba_synonyms syn_tab, dba_tables tables
where
proc_syn.name= 'YOUR_PROC'
AND REFERENCED_TYPE in ('SYNONYM','TABLE')
AND proc_syn.referenced_name = syn_tab.synonym_name
AND syn_tab.synonym_name = tables.table_name
AND syn_tab.owner = 'PUBLIC'
order by
proc_syn.referenced_owner, syn_tab.table_name;
說好約dba_dependencies也。謝謝@Maheswaran Ravisankar –