当前位置:  数据库>oracle

从一个案例看PL/SQL代码片的编译与运行

    来源: 互联网  发布时间:2017-06-21

    本文导语: PL/SQL语言是Oracle针对数据库业务逻辑需求开发的一种面向过程的结构化编程语句。在Oracle内核中,存在PL/SLQ引擎和SQL引擎两个重要组成部分,分别用于处理结构化的PL/SQL语句和SQL语句。 同所有高级语言一样,PL/SQL语句同样存在...

PL/SQL语言是Oracle针对数据库业务逻辑需求开发的一种面向过程的结构化编程语句。在Oracle内核中,存在PL/SLQ引擎和SQL引擎两个重要组成部分,分别用于处理结构化的PL/SQL语句和SQL语句。

同所有高级语言一样,PL/SQL语句同样存在编译和运行两个关键步骤。在Compile环节,主要实现语法权限检查、对象方法检查和语法结构检查。在运行Runtime阶段,相同的过程其实还是会进行,一些语句错误都是在运行时发生检测。

本篇主要通过一个错误案例,详细分析一下两者的特点和差异。

1、问题说明

朋友向笔者咨询一个问题,为什么写好的PL/SQL匿名块在执行状态时,报错没有被exception所捕获。说明:基于数据保护原因,代码片段为模拟版本。

实验环境为11gR2,具体版本号为11.2.0.4。

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0    Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

模拟代码片段如下:

SQL> declare

  2    i varchar2(10);

  3  begin

  4    select err

  5    into i 

  6    from t

  7    where rownum desc t;

Name    Type              Nullable Default Comments 

------- ------------------ -------- ------- -------- 

USER_ID VARCHAR2(100 BYTE) Y             

2、解析与测试

这个问题直观看比较唬人,但是仔细分析起来还是有概念障碍的问题。这就是程序的编译时和运行时。

我们编写PL/SQL程序的时候,无论是procedure还是package,都有一个显示compile的动作,成功之后我们才可以exec执行程序。在compile的时候,所进行的工作对于任何语言编译器来讲,都是差不多的。

常见的大多数都是验证和校验,比如使用变量是否定义?该用户有无使用对象、变量权限?变量可见性范围?或者语法使用是否正确?经过compile之后,编译器会认为程序已经具备了执行的前提条件,会将其转化为目标对象。

但是,经过编译的程序,执行过程(也就是运行时Runtime)就万无一失吗?肯定不是,内存、CPU、磁盘的资源约束,内在逻辑操作的错误、数字运算的错误都会引起一系列的运行时故障。我们说,PL/SQL中的exception,就是针对runtime的错误而言的。

一种假设:错误使用的是一个匿名块。在执行过程中,实际上是编译和运行两步走的情况。程序还没有进入runtime阶段,都被编译compile发现了错误,抛了出来。

我们通过一系列简单实验,来证明结论。首先,创建一个单独的存储过程,不执行只是编译,看结果如何?

SQL> create or replace procedure TEST

  2  as

  3    i varchar2(10);

  4  begin

  5    select err

  6    into i 

  7    from t

  8    where rownum show error             

Errors for PROCEDURE TEST:

LINE/COL ERROR

-------- -----------------------------------------------------------------

5/3      PL/SQL: SQL Statement ignored

5/10    PL/SQL: ORA-00904: "ERR": invalid identifier

错误信息和匿名块的完全相同。此时并没有进入运行时,可以推想匿名块的报错是在编译时发生的。

那么怎么能够回避编译时检查,将这个错误“送到”运行时,让exception捕获到呢?我们可以使用字符串。

SQL> create or replace procedure TEST

  2  as

  3    i varchar2(10);

  4  begin

  5    execute immediate 'select err from t where rownum


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Mysql大表查询优化技巧总结及案例分析
  • 浅析基于Oracle案例知识库设计
  • oracle使用sql脚本生成csv文件案例学习
  • 软件需求分析案例文档
  • 高分请教http://java.isavvix.com/ JSP成功案例,成功后有更多分相送。
  • jquery ajax 局部刷新小案例
  • Oracle案例:分析10053跟踪文件
  • 这个案例有错误望赐教!太过简单了简直是送分!
  • Linux下Oracle常见安装错误总结及参考案例
  • 求linux文件服务器解决方案案例
  • Oracle PL/SQL入门案例实践
  • 在网关中使用Nginx配置HTTP透明代理案例
  • 100分:请各位前辈列举JAVA应用的典型案例.谢谢!
  • oracle—SQL技巧之(一)连续记录查询sql案例测试
  • Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
  • Android拨号盘 支持T9搜索和号码搜索等拨号盘案例
  • HTML标签参考手册 iis7站长之家
  • Android CheckBox 的使用案例分析
  • android开机自启动原理与实现案例(附源码)
  • PHP中使用sleep造成mysql读取失败的案例和解决方法
  • Oracle案例详细分析:Job任务停止执行


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3