关于shell中的pl/sql脚本错误排查与分析(r4笔记第21天)

今天有个同事问我一个问题,他说运行shell脚本的时候抛出了ORA 错误,但是对于错误的原因没有思路,想让我帮他看看。 我查看了下,脚本的结构比较清晰。 脚本是有一个shell脚本,一个sql文件组成,shell脚本作为基本的流程控制,sql文件中是pl/sql脚本。 大体明白了shell脚本的部分,没有做过多的追究,就开始了解pl/sql脚本的内容了。 首先在pl/sql中声明了大量的procedure,类似shell中的function,大概有10多个procedure 然后在最后使用一个类似main函数的pl/sql块来判断,什么场景调用什么procedure 脚本结构类似

declare
flag varchar2(100); --声明的变量
procedure proc1 is 
begin
dbms_output.put_line('this is a test for procedure one');  --存储过程的内容
end;
procedure proc2 is 
begin
dbms_output.put_line('this is a test for procedure two);
end;
---more procedures defined here
begin                 --类似main方法的部分
flag:='a';             --声明的变量通过shell变量传入
if(flag='a') then
proc1;                --调用存储过程
end if;
if(flag='b') then
proc2;
end if;
end;
/

存储过程大概有10多个,所以抓住重点来看整个shell脚本就比较清晰了,要不直接上来就看存储过程的细节,马上就迷茫了。 明白了存储过程的整体实现思路,来看抛出的错误,错误是一个老套的ORA错误。 ORA-00942: table or view does not exist 根据错误的信息,出错的地方是在第一个存储过程proc1 这个存储过程的内容就很丰富了,里面会调用动态sql创建view,创建临时表。 细数下来,创建view,function,table的操作大概有6,7处。 如何尽快地排查出倒底是在哪个环节出错还是比较棘手的。 比如一个调用动态pl/sql创建view, 创建的于假设为 create or replace view test_view as select xxxxx,xxxx,xxxxx, xxx from table1,table2,table3,table4 where xxxxxxx xxxxx xxxx 对于大量的这种操作一种比较快捷的方式就是使用explain plan来校验。 因为有些pl/sql块不能随便执行,不能随便创建view,table等,所以通过explain plan能够快速的校验出哪些表可能存在问题或者无法访问等等。 如果存在,那么很快就会解析生成执行计划。影响是很小的。 SQL> explain plan for select test.object_id,t.object_id from test ,t where test.object_id=t.object_id; Explained. 如果出错,就会很明显的得到错误的出处。 explain plan for select test.object_id,t.object_id from test ,ttttt t where test.object_id=t.object_id * ERROR at line 1: ORA-00942: table or view does not exist 这样就会很明显的发现错误之处在于ttttt不可访问或者不存在。 明白了这点,问题的检查会很有条理,可以略过一些复杂的pl/sql过滤条件细节,一般from之后的表名都不会是动态的。可以很方便地进行校验。 但是让人奇怪的是检查了一圈,没有发现问题。最后无奈之下就尝试在脚本中临时加入一些信息日志,然后精确地定位出错的问题才发现原来是文件路径的问题, 比如在库文件的根路径在 /u01/app/plsql/test.sql 但是在开发目录下运行脚本的时候路径是/u02/app/plsql/test.sql 这样在shell脚本中调用使用@test.sql的调用方式来运行pl/sql块就很可能就是库文件的路径而不是当前的开发目录下了。 这种问题可能比较隐晦,出了问题确实不好查找,可以使用绝对路径来完成,绝对路径可以根据shell变量来灵活的配置指定。 比如库文件路径为我们定义变量LIB_CORE_PATH= /u01/app/plsql 定义开发路径为 LIB_DEV_PATH=/u02/app/plsql,这样在调用的时候就可以明确的指定需要使用哪个文件了。 问题的校验过程是枯燥繁琐的,但是当明白了问题的原因之后,才发现都是有一些潜在的问题造成的。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-01-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coding for love

进程与线程,单核与多核1. 简介2. 程序3. 进程4. 线程5. 多进程与多线程的选择6. 小结参考

用户打开浏览器,其实就是打开了浏览器应用程序。那么什么是程序呢?我们常说浏览器是多线程的,JS 是单线程的,那么什么是线程呢?说到线程,和我们常说的进程有什么关...

44630
来自专栏黑白安全

PHP安全编码规范之安全配置篇

因为配置不当引发的安全问题是屡见不鲜的,通过一系列的安全配置,可以很好的解决一些安全隐患,从而为系统增加安全系数。但是在开发过程中,因为需求的改变和编程的习惯可...

31520
来自专栏java一日一条

一篇文章了解RPC框架原理

RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。使用RPC可以解耦系...

23640
来自专栏数据和云

深入剖析 ORA-04031 的前世今生

李磊 云和恩墨技术专家 每一个接触过 Oracle 数据库的人想必听到 Ora-04031 都会有一种捶胸顿足的感觉,至少在两年前的我是这样子的。都说 Ora...

35840
来自专栏企鹅号快讯

Redis

Redis介绍: (Redis)是一个基于 key-value 键值对的持久化数据库存储系统。支持多种数据结构,包括 string (字符串)、list (链表...

47170
来自专栏飞雪无情的博客

Go语言实战笔记(十二)| Go goroutine

一般的程序,如果没有特别的要求的话,是顺序执行的,这样的程序也容易编写维护。但是随着科技的发展、业务的演进,我们不得不变写可以并行的程序,因为这样有很多好处。

13030
来自专栏张戈的专栏

【 ES 私房菜】收集 Nginx 访问日志

在上一篇系列文章《【 ES 私房菜】收集 Apache 访问日志》中,我们已经完成了 ES 收集 A pache 日志的目标,再收集其他 WEB 日志也就小菜一...

83000
来自专栏测试开发架构之路

Keepalived+Nginx高可用架构配置

19420
来自专栏Web项目聚集地

Maven学习笔记(一)

本教程作者是「小灯光环」,作者简介:全栈开发工程师,CSDN博客专家,CSDN论坛 Java Web/Java EE版主,热爱技术,乐于分享,在分布式Web开发...

8920
来自专栏数据和云

典型案例:深入剖析 ORA-04031 的前世今生

李磊 云和恩墨技术专家 每一个接触过 Oracle 数据库的人想必听到 Ora-04031 都会有一种捶胸顿足的感觉,至少在两年前的我是这样子的。都说 Ora-...

33690

扫码关注云+社区

领取腾讯云代金券