使用'execute'执行查询语句和PL SQL中的目录有什么区别?

时间:2014-03-02 06:39:38

标签: sql oracle plsql oracle10g procedure

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)变量

2 个答案:

答案 0 :(得分:4)

每个PL/SQL将在执行前首先编译。这里的编译涉及PL / SQL结构的语法检查和对正在使用的SQL的语义检查。

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

然而,在另一种方法中,SQL在编译期间被解析用于语义检查。我们将其称为 Static SQL。我们得到了编译过程中所有无效的SQL语句错误。

另一个主要区别是,在PROCEDUREFUNCTION中使用静态SQL时。 Oracle会使用Procedure / function创建该表名的依赖关系。您可以在dba_dependencies表中找到它们。

创建这样的依赖项是非常重要的,因为当通过修改函数中引用的列名来更改表或者删除表/视图/类型本身时,Oracle将INVALIDATE功能。因此,确保,我们没有得到意外的异常。但是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;

答案 1 :(得分:1)

立即执行用于调用动态SQL以获取更多信息,请参阅oracle Documents