http://www.itnose.net/detail/6033960.html更?文章?ahref="http://www.itnose.net/type/97.htm..." />
ǰλã >> SQL >> Oracle 存储函数和存储过?PL/SQL子程
  ϸ

Oracle 存储函数和存储过?PL/SQL子程

ȶȣ311   ʱ䣺2016-05-05 11:28:51.0
Oracle 存储函数和存储过?PL/SQL子程?

文章来源?a href="http://www.itnose.net/detail/6033960.html" style="color: #2d64b3;">http://www.itnose.net/detail/6033960.html
更?文章?a href="http://www.itnose.net/type/97.html" style="color: #2d64b3;">http://www.itnose.net/type/97.html

PL/SQL子程?包括函数和过程?这里的函数指的?户自己定义的函数,和系统函数?同的。子程序??完成特定功能的PL/SQL程序块,并且具有?定的通用性,??同的应用程序多?调用。Oracle提供?把PL/SQL程序存储在数??并可以再任何地方来运行它。这样就?存储过程或?是函数。过程和函数的唯?区别就是函数总是向调用?返回数?而过程则不返回数???/p>

函数

如果用户要经常执行某些操作,并且?要返回特定的数据,那么就?将这些操作构造成??数??/p>

?使用SQL?定义函数?/p>

基本??/p>

create or replace function fun_name(argument [in | out | in out ]datatype  ...)
return datatype 
is | as
       -- ?要定义的变量 ,?录类??游标
begin
       --函数的执行体
exception
       --处理出现的异?br>end ;

其中,return datatype ???返回数据的类型?IN参数标?表示传?给函数的?在函数执??改变;OUT标?表示???在函数进?计算并?过该参数传递给调用?;IN OUT 标?表示传?给函数的?可以变化并传?给调用??/p>

例:定义??回hello 的函?/p>

create or replace function hello
return varchar2 
is
begin
       return 'Hello World';
end ;

执? ,Function created ,函数创建成功??/p>

函数的调?与Oracle内置函数的调用相同,?使用select hello from dual ;进?调用,也?使用PL/SQL?进?调用 ?/p>

begin 

  dbms_output.put_line(hello);

end ;

?创建带参数的helloworld函数

create or replace function helloworld(str varchar2)
return varchar2
is
begin
       return 'Hello' || '_' ||str ;
end ;

函数的调用?在函数名称后面加上参?即:select helloworld('World') from dual ;使用Pl/sql的调用除了加上参数?与上面相同,不在赘述?/p>

例:求一?门中,员工的工资总数的函?/p>

create or replace function get_sal(dept number)
return number 
is
       v_sum number(10) := 0 ;
       cursor sal_cursor is select sal from emp where deptno = dept ;
begin 
       for c in sal_cursor loop
           v_sum := v_sum + c.sal ;
       end loop ;
       return v_sum ;
end ;

存储过程

存储过程,可以?多个应用程序调用,也?向存储过程传递参数,向存储过程传回参数??/p>

基本?

create or replace procedure pro_name(argument [in | out | in out ]datatype  ...) 
is | as
       -- ?要定义的变量 ,?录类??游标
begin
       --函数的执行体
exception
       --处理出现的异?br>end ;

例:使用存储过程,求部门的工资?和

create or replace procedure get_sal1(dept number ,sumsal out  number)
is
       cursor sal_cursor is select sal from emp where deptno = dept ;
begin 
       sumsal := 0 ;
       for c in sal_cursor loop
           sumsal := sumsal + c.sal ;
       end loop ;
       dbms_output.put_line(sumsal);
end ;

存储过程的调?

declare 
  v_sum number(10) := 0 ;
begin 
  get_sal1(30 , v_sum);
end ;

调用格式?/p>

 

CALL | EXCEUTE procedure_name(arg_list) ;

?使用show error 命令来提示源码的错?位置。使用user_error 数据字典来查看各存储过程的错????

 

删除过程和函?/strong>

删除过程

?如下?/p>

DROP PROCEDURE[USER.]procedure_name ;

删除函数

?如下?/p>

DROP FUNCTION [USER.]function_name ;