暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle PL/SQL存储过程与函数

DBA从零开始 2021-04-21
1179

子程序: 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;

/

练习看后面

最后修改时间:2021-04-21 15:24:10
文章转载自DBA从零开始,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论