oracle的存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle的存储过程相关的知识,希望对你有一定的参考价值。

有a,b两张表,a表中有date,card_id和fid字段,b表中有id字段,写一个存储过程,更新b表中的id字段使id等于a表中的fid

1.存储过程可以使得程序执行效率更高、安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性问题,如:sql注入
2.建立过程不会很耗系统资源,因为过程只是在调用才执行。
3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。

4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。

5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。

7.增强安全性:
a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
b、提高代码安全,防止 SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);
c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。

缺点就是:
1、大量的利用过程,会对服务器压力比较大。追问

说了一推废话

参考技术A 按照我的理解我觉得,a,b表应该还是什么其他的联系吧,如果有,那么就
不用写存储过程用merge就行了,至于具体怎么用,自己查查看。

如果没有,那就直接truncate insert ,就行了,不用写什么过程。
参考技术B 你是想要如果a表中增加新数据了,然后用b表去记录新增的fid吧。
如果只是集体临时添加的话,你可以用二楼说的merge就可以;如果你想时时如此操作,建立触发器吧。
参考技术C b表不能只有一个id字段吧,有木有用来和a表关联的字段呀?

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 如何终止存储过程的运行!

oracle 存储过程中调用存储过程

oracle中的存储过程怎么写

oracle存储过程中循环调用存储过程

oracle存储过程里调用存储过程

请问oracle怎么执行存储过程