在 PL SQL 中使用“执行”和目录执行查询语句有啥区别?
Posted
技术标签:
【中文标题】在 PL SQL 中使用“执行”和目录执行查询语句有啥区别?【英文标题】:What is the difference between executing query statements using 'execute' and directy in PLSQL?在 PL SQL 中使用“执行”和目录执行查询语句有什么区别? 【发布时间】:2014-03-02 06:39:38 【问题描述】:st :='SELECT USERNAME FROM LOGIN WHERE USERNAME =: a and PASSWORD =: b';
execute immediate st into un using username,pw;
或者
SELECT USERNAME INTO un FROM LOGIN WHERE USERNAME = username and PASSWORD = pw;
其中username
、un
和pw
是varchar2(50)
变量
【问题讨论】:
【参考方案1】:每个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;
【讨论】:
关于 dba_dependencies 也说得很好。谢谢@Maheswaran Ravisankar【参考方案2】:立即执行用于调用动态 SQL 了解更多信息,请参阅oracle Documents
【讨论】:
接受的答案!!嗯:) :) @oracleuser 我很高兴 :) 我明白……干杯老兄!以上是关于在 PL SQL 中使用“执行”和目录执行查询语句有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章