子程序和程序包

一、函数(function
1
、无参function

create or replace function f_hello return varchar2 as 

begin 

return 'Hello,world!'

end

declare 

v_result varchar2(200);  

   DBMS_OUTPUT.put_line(v_result);

  end;

2、有参function

create or replace function f_hello(f_name varchar2) return varchar2 as

begin

return 'Hello,' || f_name;

end;

declare 

v_result varchar2(200);

begin

 v_result := f_hello('张三'); 

DBMS_OUTPUT.put_line(v_result); 

end;

二、存储过程(procedure)
1
、什么是存储过程?

存储过程(procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
比如一个生成订单的过程,我需要记录订单表,日志表,更新客户信息表,更新客户积分等等的操作.那可以把这些操作都放在一个存储过程中实现。每次生成订单,只需要通过程序调用一下存储过程就可以了。而不需要通过程序去多次连接数据库,每次执行对一个表的操作。

2、存储过程如何授权?

[sql] view plain copy

1.  //1)授权给scott用户可以调用函数或存储过程(hello)  

2.  grant execute on hello to scott;  

3.  //2)授权给所有用户都能调用函数或存储过程(hello  

4.  grant execute on hello to public;  

3、存储过程的优点有哪些?

(1)更好的重用:一次创建,任意使用。
(2)更快的执行效率:SQL语句大量执行或重复执行时,执行存储过程比SQL语句快。
(3)更少的网络流量:几百行的SQL语句,在网络中只需要发送一条存储过程执行的语句即可。
(4)更好的安全机制:可以授权存储过程给指定的用户,或者将存储过程设置为public。

4、存储过程例子
(1)存储过程之交换参数

[sql] view plain copy

1.  <span style="font-size:10px;">create or replace procedure p_swap(p_n1 in out number,p_n2 in out number) as   

2.  --声明临时变量  

3.  temp number;  

4.  begin  

5.    --交换参数  

6.    temp := p_n1;  

7.    p_n1 := p_n2;  

8.    p_n2 := temp;  

9.  end;  

10. declare  

11.   a number;  

12.   b number;  

13. begin  

14.   a := 1;  

15.   b := 2;  

16.   DBMS_OUTPUT.put_line('交换前:a=' || a || ',b=' || b);  

17.   --调用存储过程  

18.   p_swap(a,b);  

19.   DBMS_OUTPUT.put_line('交换后:a=' || a || ',b=' || b);  

20. end;  

21. </span>  

(2)创建一个存储过程,求年龄?

[sql] view plain copy

1.  <span style="font-size:10px;">create or replace procedure p_get_age(p_d1 date,p_d2 date,p_age out number) as  

2.  begin  

3.    p_age := trunc(months_between(p_d1,p_d2)/12);  

4.  end;  

5.    

6.  declare  

7.    age number;  

8.  begin  

9.    p_get_age(sysdate,date'1994-10-15',age);  

10.   DBMS_OUTPUT.put_line('生日为:' || age);  

11. end;</span>  

(3)根据ID查询出学生的信息并直接在过程里打印出来

[sql] view plain copy

1.  <span style="font-size:10px;">create or replace procedure p_get_student(p_id in number,row out student%rowtype) as  

2.  begin  

3.    select * into row from student where id = p_id;  

4.  end;  

5.    

6.  declare  

7.    row student%rowtype;  

8.  begin  

9.    p_get_student(2,row);  

10.   DBMS_OUTPUT.put_line('ID' || row.id || ',姓名:' || row.name);  

11. end;</span>  

三、 函数(function)和过程(Procedure)的区别

1、procedure用于处理复杂的业务逻辑,function用于处理复杂的sql语句
2、procedure可以有out参数类型,function数没有;
3、procedure在声明中可以不包含return子句,且执行代码块中没有返回值;
4、procedure必须声明return并指明返回是什么类型,且执行代码块中有返回值(return ...)。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭