关于Oracle的函数和存储过程,还有一点异常情况。

函数和存储过程都可以有返回值,但是函数常用于计算场景,而存储过程多用于对表记录的查询,修改,插入,删除等操作。

create or replace function 函数名称
(  --这里有括号
--函数形式参数声明部分
--函数的参数声明不能带有精度,比如number(10)  就是错的,直接number就可以。
参数名  in|out|in out 数据类型    
)  --这里也有括号   
return 数据类型 
--反馈的数据类型,也不需要带精度,这个语句只有在参数列表中含有被标记为out或者 in out的参数时才有意义。                     
is|as
--函数内部变量定义部分
--这里我用“定义”这个词,是因为相比上部分的形式参数“声明”不同,这里的数据类型必须指定精度。
变量名称  数据类型              

begin 
  执行部分
  return 表达式 
/*
 函数可以反馈两个地方的东西,一个是参数声明部分用了out或者in out标识的参数,
 这种参数的反馈不需要在函数内部再用return,
 因为,out或者in out 就已经表示了这个参数是必须返回的,
 而且在参数声明部分已经存在一个return子句。
 相应的,函数调用者在调用有参数返回的函数时,(注意:是参数返回,而不是变量),
 调用函数的实参就必须是一个变量,这很好理解,你去找别人要东西,别人给了,
 你不伸手接,也不拿东西装,是个什么意思呢?
 所以调用的实参就必须是个可以接受反馈数据的变量,而且类型要相一致。
 需要将函数内部变量或者表达式返回给函数调用者,就必须在函数内部用return语句。
*/
                 
exception
  异常处理部分

end 函数名称 

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

create or replace procedure 存储过程名
(
  参数名 in|out|in out  参数数据类型
	--如前文所言,存储过程多用于对表记录的插入,修改,删除等操作
	--所以,这里的数据类型多使用type% 来声明,例如:参数名甲 某表.某列%type
	--这样,参数名甲的数据类型和精度就和某表某列的一样了。这就有利于后期对某表某列的操作
	--还有%rowtype, 这个就不是和表的某一列相同,而是和某表的某一行相同。也就是和表的表结构相同。
)
is|as
  声明部分  
	--这里一般是用来声明异常情况的,说到异常情况。我查了一下,居然有19758条之多。委实有点吓人。
	

begin 
	  执行部分
	
 exception
	  异常处理

end 存储过程名  
---oracle 所有的异常信息和错误编码可以通过下面的方式得到。其中 sqlerrm() 应该是oracle内置的函数。

create table oracle_error(errnum number(10),errmsg varchar2(100));

declare
 err_msg varchar2(500);

begin 
	/*得到oracle的所有错误信息*/
  for err_num in -100000..0 loop
	  err_msg :=sqlerrm(err_num);
		insert into oracle_error values(err_num,err_msg);
end loop;
commit;
end;		  

select * from oracle_error t 
where t.errmsg not like '%Message%not found%' 
and t.errmsg not like '%non-ORACLE%' 
order by t.errnum  ; 







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值