子程序: PL/SQL的过程和函数统称为子程序。
匿名块: 以DECLARE或BEGIN开始,每次提交都被编译。匿名块不在数据库中存储并且不能直接从其他PL/SQL块中调用。效率低。
命名块:除匿名块之外的其他块。包括过程,函数,包和触发器。可以在数据库中存储并在适当的时候运行。
子程序具有可扩展性,可以自定义 PL/SQL 语言以满足应用程序的需要。
子程序具有可复用性,因为子程序只要有效,就完全可以用于任何数目的应用程序中。
子程序具有更好的可维护性,简化了维护/优化过程,因为如果定义更改只有子程序受到影响。
PL/SQL存储过程、函数在数据包中声明。
创建过程的基本语法:
CREATE [OR REPLACE] PROCEDURE Procedure_name
[ (argment [ { IN | OUT | IN OUT }] Type,
argment [ { IN | OUT | IN OUT } ] Type
{ IS | AS }
<类型.变量的说明>
BEGIN
<执行部分>
EXCEPTION
<可选的异常错误处理程序>
END;

exec my_pro(7788);
将过程的执行权限授予其他用户:
SQL> GRANT EXECUTE ON proc TO tim;
SQL> GRANT EXECUTE ON swap TO PUBLIC;
只给执行的权限是不能进行内部的DML操作的。
删除过程:
SQL> DROP PROCEDURE proc;
过程参数的三种模式:(in, out, in out)
IN 用于接受调用程序的值,默认的参数模式。 只读
OUT 用于向调用程序返回值。只写
IN OUT 用于接受调用程序的值,并向调用程序返回更新的值。
例:(in)
create or replace procedure proc1(i in number)
as
a varchar2(50);
begin
a := '';
for j in 1..i loop
a := a || '*';
dbms_output.put_line(a);
end loop;
end;
/
使用sqlplus调用,只能调用in型的;?
exec proc1(6);
使用程序的方法调用
begin
proc1(6);
end;
/
例:(out)
create or replace procedure proc2(j out number)
as
begin
j:=100;
end;
/
declare
k number;
begin
proc2(k);
dbms_output.put_line(k);
end;
/
or
variable v_sal number;
exec proc2(:v_sal);
begin
dbms_output.put_line(:v_sal);
end;
/
例:(in out)
create or replace procedure proc3 (p1 in out number, p2 in out number)
is
v_temp number;
begin
v_temp:=p1;
p1:=p2;
p2:=v_temp;
end;
/
declare
num1 number :=100;
num2 number :=200;
begin
proc3(num1, num2);
dbms_output.put_line('num1='||num1);
dbms_output.put_line('num2='||num2);
end;
/
练习看后面
函数:
形参不能是 PL/SQL 类型,只能是数据库类型。
函数的返回类型也必须是数据库类型。
有且仅有一个返回值。
执行语句中的返回值必须和声明中的返回值类型一致。
访问(调用)函数的两种方式:
使用 PL/SQL 块
使用 SQL 语句
例:
create or replace function fun_hello return varchar2
is
begin
return '你好!';
end;
/
调用
select fun_hello from dual;
or
begin
dbms_output.put_line(fun_hello);
end;
/
练习看后面




