关于shell中的pl/sql脚本错误排查与分析

今天有个同事问我一个问题,他说运行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,这样在调用的时候就可以明确的指定需要使用哪个文件了。

问题的校验过程是枯燥繁琐的,但是当明白了问题的原因之后,才发现都是有一些潜在的问题造成的。

时间: 2024-10-12 12:43:29

关于shell中的pl/sql脚本错误排查与分析的相关文章

OraRep OSPRep v0.4.7发布 shell脚本的PL/SQL代码片段

OraRep是一个嵌入在shell脚本的PL/SQLhttp://www.aliyun.com/zixun/aggregation/17348.html">代码片段,用于已知的数据库实例中创建一个格式良好的HTML报告,为你提供实例概述,和性能优化的一些提示信息.它已经通过Oracle 8.1.7.9.0.1 和 9.2的测试.OSPRep提供额外的插件,用于更详细特殊问题的报告,它可以随意地用图表创建一个单独的页面进行可视化的结果. OraRep OSPRep v0.4.7版本主要是进行

《Oracle PL/SQL程序设计(第5版)》一一2.6 在其他语言中调用PL/SQL

2.6 在其他语言中调用PL/SQL Oracle PL/SQL程序设计(第5版) 总有一天,你会在从C.Java.Perl.PHP或其他语言中调用PL/SQL.虽然这是一个很合理的需求,如果你曾经做过跨语言的开发工作,你一定熟知要把各种语言专有的数据类型糅合在一起─尤其是那些复合数据类型,比如数组.记录或者对象类型─的复杂性,更不用说不同的参数语法或者厂商对所谓"标准"应用编程接口(API)的扩展,比如微软的ODBC(Open Database Connectivity). 我会用几

Oracle中使用PL/SQL操作COM对象

PL/SQL是由Oracle公司对标准SQL进行扩展,专用于Oracle数据库中程序设计的专用语言,属第三代过程式程序设计语言.从Oracle8开始提供了直接从PL/SQL中调用外部C语言过程,允许开发人员用PL/SQL进行使用C语言编制的程序模块.从Oracle8i开始,又引入了Java程序. 在本文中主要介绍外部例程的基本原理以及使用条件,介绍如何通过引用外部例程来操作Windows中的COM对象,并做了一个操作Excel对象的示例. 本文的运行环境全部建立在Oracle9i和Windows

Oracle中在pl/sql developer修改表的两种方式

一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住. 二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t.

Oracle中在pl/sql developer修改表的两种语句

一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住. 二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t. 该种方式也可以修改多表联合查询的情况,现有table1和ta

Oracle中在pl/sql developer修改表的2种方法_oracle

一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住.   二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t.

PL/SQL用光标查询多条记录

PL/SQL光标为程序提供了从数据库中选择多行数据,然后对每行数据单独进行处理的方法,它为Oracle提供了一种指示和控制SQL处理的各个阶段的方法.我将认为您已经对PL/SQL有一定的了解.通过本文,您将学会:光标的创建 光标的处理 定义和使用光标属性 一. 什么是光标Oracle使用两种光标:显式光标和隐式光标.不管语句返回多少条纪录,PL/SQL为使用的每一条UPDATE.DELETE和INSERT等SQL命令隐式的声明一个光标.(要管理SQL语句的处理,必须隐式的给它定义一个光标.)用户

[转贴]Oracle PL/SQL语言基础

oracle|sql语言 [转贴]Oracle PL/SQL语言基础 Oracle PL/SQL语言基础   PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序.    PL/SQL的优点    从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有

Oracle PL/SQL语言基础

oracle|sql语言 Oracle PL/SQL语言基础  2002-8-23   Oracle PL/SQL语言基础 PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独