oracle存储过程提示编译完成但存在错误,如何查看错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程提示编译完成但存在错误,如何查看错误相关的知识,希望对你有一定的参考价值。

新写了一个存储过程,在toad里刷到数据库上,提示
“compiled but with compilation errors”,但是无法查看哪里出错。在java里调过程时就出错,说过程无效,请问我应该如何确定过程里哪个地方出现了错误呢?

1、首先打开PL/SQL Developer软件,新建sql窗口。

2、打开修改oracle存储过程,该存储过程有一个输入参数(pid)跟一个输出参数(name),即通过用户id查询用户名称并将名称返回。

3、调试存储过程,找到刚刚修改的存储过程右击并点击【test】选项。

4、在打开的窗口内修改id值并点击左上角的倒三角形图标开始调试。按【CTRL+N】进行单步进入调试,【CTRL+O】单步调试,【CTRL+T】退出调试,也可以点击调试工具进行调试。

5、变量查看,在窗口下方可输入变量名称观察变量的变化情况。

6、调试完成后就可以检查调试结果,可以在调试结果中查看错误。

参考技术A

可用第三方工具检查错误。

如以下存储过程:

其中第六行故意少写了一个分号。

然后执行后,会提示完成,这时可以去左边的树中找到这个存储过程,显示是有个红叉的。

这时,可以右键,选择编辑。

然后打开页面的最下方会显示如下信息。

此时鼠标双击信息的那一行,会在上方存储过程中以特殊颜色显示,这就说明,有特殊颜色的位置有错误,可以根据ORA-00933的错误号查询错误原因,并加以修改。

现在,如果可以后边的逗号补上,点执行,然后,下边会显示成功编译且左边的树红叉消除。

参考技术B 用sqldeveloper吧。。oracle自带的ui,在里面应该能看出错误的 参考技术C 使用如下查询语句即可获取存储过程编译错误明细:
select * from sys.user_errors a where a.name = upper('存储过程名');

select * from user_errors a where a.name = upper('存储过程名');
参考技术D 编译完成,不代表里面语句没问题,你最好看看你定义的类型和sql语句什么的查询还有错误,逻辑上的错误?

oracle存储过程,如何获得详细的错误信息

存储过程示例如下:
create or replace procedure proc_test( strAge in string, strName in string, ret_code out string, v_error_message out string) is
begin
declare
strsql varcchar(1024);
begin

strsql :='select name from student where age=100';
execute immediate strsql using strAge ;

strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ;

ret_code:=0;
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_message := sqlerrm;
rollback;

end;
end proc_cancel_digital_id;

上面的存储过程是例子。
上面的任何一个select执行时,如果查不到数据都会抛异常。数据库返回码是100,找不到数据。
但是我想获得详细的错误信息,到底是上面的student找不到记录,还是teacher表找不到记录,请问这里要怎么做?谢谢

参考技术A create or replace procedure proc_test( strAge in string, strName in string, ret_code out string, v_error_message out string) is
begin
declare
strsql varcchar(1024);
v_error_desc varcchar(1024);
begin
v_error_desc :='student';
strsql :='select name from student where age=100';
execute immediate strsql using strAge ;

v_error_desc :='teacher';
strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ;

ret_code:=0;
v_error_desc :='OK';
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_desc := '错误位置:' || v_error_desc;
v_error_message := sqlerrm;
rollback;

end;
end proc_cancel_digital_id;本回答被提问者采纳
参考技术B 推荐你去猎豹IT网校上,有个oracle视频教程,看看是否学一下自己就能处理了。 参考技术C 用Oracle的企业管理器EM,在那个里面运行PL/SQL就能看到错误的具体信息了追问

我这个存储过程是c语言调用的,我希望错误能够定位更准确一些,是查询那个表的时候错误了,这样可以C语言获得存储过程的返回信息,输出到日志,将来定位时很方便。

追答

你上网找找返回Oracle异常信息ORA号的函数吧,找到ORA号就能找到相应的错误信息了,具体怎么弄没试过

以上是关于oracle存储过程提示编译完成但存在错误,如何查看错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

如何找出存储过程最后一次在 Oracle 中修改或编译的时间?

警告:已编译但在 oracle 中存在编译错误

在 navicat 连接的oracle中,调用存储过程 报错?

Oracle存储过程编译卡死的解决方法

oracle存储过程,如何获得详细的错误信息