在 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;

其中usernameunpwvarchar2(50) 变量

【问题讨论】:

【参考方案1】:

每个PL/SQL 都会在执行前先编译。此处的编译涉及 PL/SQL 结构的语法检查和所用 SQL 的语义检查。

通过EXECUTE IMMEDIATE 运行SQL 意味着动态解析和执行查询。然后我们将其命名为 Dynamic SQL。动态 SQL 是使用字符串和查询形成的,因此 Oracle 事先并不知道。并且只有在运行时,它才会被编译和执行。

而在另一种方法中,SQL 在编译过程中被解析以进行语义检查。我们称之为静态 SQL。我们在编译过程中得到了所有无效的 SQL 语句错误。

另一个主要区别是,在 PROCEDUREFUNCTION 中使用静态 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 中使用“执行”和目录执行查询语句有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQLPL/SQL中动态执行SQL语句

什么是PL/SQL

PL/SQL 语句的 SQL 查询不起作用

pl/sql 执行sql语句的时候总是在初始化?

PL/SQL基础的执行部分

pl/sql连接Oracle不管执行啥语句都会重复执行这条语句,永不停止,怎么办呀