2014-03-02 78 views

回答

4

PL/SQL將執行前先編譯。這裏的編譯涉及PL/SQL結構的語法檢查和對正在使用的SQL的語義檢查。

通過EXECUTE IMMEDIATE運行SQL意味着查詢將被動態解析並執行。然後我們將其命名爲動態 SQL。動態SQL由一個字符串和查詢組成,因此Oracle之前並不知道這些查詢。只有在運行時纔會被編譯和執行。

而在另一種方法中,SQL在編譯期間被解析用於語義檢查。我們將其稱爲靜態 SQL。在編譯期間,我們得到了所有無效的SQL語句錯誤。

另一個主要的區別是,在PROCEDUREFUNCTION中使用靜態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; 
+0

說好約dba_dependencies也。謝謝@Maheswaran Ravisankar –

1

執行即時用於調用動態SQL的更多信息,請oracle Documents

+0

接受的答案!嗯:) –

+0

:) @oracleuser我很高興 –

+0

:)我明白,..乾杯哥們! –

相關問題