【问题标题】: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) 变量

【问题讨论】:

    标签: sql oracle plsql oracle10g procedure


    【解决方案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 我很高兴
    • :) 我明白……干杯老兄!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2020-02-18
    相关资源
    最近更新 更多