每个PL/SQL 都会在执行前先编译。此处的编译涉及 PL/SQL 结构的语法检查和所用 SQL 的语义检查。
通过EXECUTE IMMEDIATE 运行SQL 意味着动态解析和执行查询。然后我们将其命名为 Dynamic SQL。动态 SQL 是使用字符串和查询形成的,因此 Oracle 事先并不知道。并且只有在运行时,它才会被编译和执行。
而在另一种方法中,SQL 在编译过程中被解析以进行语义检查。我们称之为静态 SQL。我们在编译过程中得到了所有无效的 SQL 语句错误。
另一个主要区别是,在 PROCEDURE 或 FUNCTION 中使用静态 SQL 时。 Oracle 将使用Procedure/function 创建该表名的依赖关系。您可以在dba_dependencies 表中找到它们。
创建这样的依赖关系非常重要,因为当通过修改函数中引用的列名或删除表/视图/类型本身来更改表时,Oracle 将INVALIDATE 函数。因此确保我们不会得到意外的异常。但是 DYNAMIC sqls 将是完全匿名的,并且不会创建任何依赖项。由于这个原因,您可能会收到 ORA-942 TABLE OR VIEW DOESNOT EXISTS 错误,只有 DYNAMIC sql 而不是 Static 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;