每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 –