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