剑破冰山学习笔记:
嵌套子程序的说明:
将一个子程序定义在一个PL/SQL块中的,该子程序称为嵌套子程序。
•只有定义在具名块中,才能存储到数据库中,匿名块里是无法存储到数据库的
区别
–函数和过程是Schema级别的子程序,包里的函数和过程,是Package级别的子程序。这两类都不是嵌套子程序。
声明
–嵌套子程序可以同时声明和定义,也可以先声明,然后在同一个PL/SQL块内再定义。后者称为”前置声明“。
具体示例:
在匿名块中使用。
declare
function aa(a number) return number
as
begin
return a*5;
end;
begin
dbms_output.put_line(aa('2'));
end;
直接声明并且调用。
可以对函数进行重构,也就是定义两个相同的名称。
declare
function aa(a number) return number
as
begin
return a*5;
end;
function aa(a varchar2)return number
as
begin
return to_number(a)*15;
end;
begin
dbms_output.put_line(aa('2')); --修改此处可以看出区别
end;
也可以在函数和存储过程的定义中使用,一下为存储过程的例子:
create or replace procedure calctriangleareagirth_1 (a number ,b number ,ang number)
as
function calcareabytwoside_ang(a number,b number,ang number) return number
as
rad number;
s number;
begin
rad:=ang/180*(asin(1)*2);
s:=round(a*b*sin(rad)/2,2);
return s;
end;
function calcgirthbytwosides_ang(a number ,b number, ang number) return number
as
rad number;
c number;
g number;
begin
rad:=ang/180*(asin(1)*2);
c:=sqrt(a**2+b**2-2*a*b*cos(rad));
g:=round(a+b+c,2);
return g;
end;
begin
dbms_output.put_line('area:' || to_char(calcareabytwoside_ang(a,b,ang)) || ' girth:'|| to_char(calcgirthbytwosides_ang(a,b,ang)));
end;