2014-03-02 69 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

:)我明白,..干杯哥们! –

相关问题