六 使用PL/SQL进行ORACLE编程

 

1、  PL/SQL语言

PLSQL是一种专门为ORACLE数据库开发的编程语言。这种语言通过提供过程化的结构扩展了SQL 语言,并且便于生成用户接口代码。

PLSQL将面向集合结构和过程控制工具这两个优点结合在一起。

1.1   匿名的和存储的PLSQL程序块

匿名的PLSQL程序块

存储在客户机上,或远程存储。远程存储的代码会被动态地编译,效率比较低。

匿名的PLSQL程序块只运行一次。

示例:

declare increase number := 10;

begin

update emp set sal=sal*(100+increase)/100;

commit;

end;

/

存储的PLSQL程序块

存储在服务器上,其会被载入数据库,并且存储在数据字典内。这个程序块被保存到数据字典前会被编译。

存储的PLSQL程序块可以预先被编译,从而能够被多次执行。

示例:

create or replace procedure ins_sal(increase number)

as

begin

update emp set sal=sal*(100+increase)/100;

commit;

end;

/

 

execute ins_sal(10);

 

1.2   PLSQL对象

过程

函数

程序包

程序包主体

触发器

2、  过程、函数与程序包

2.1 过程与函数

过程是一个执行某些动作的代码块。其中包括形参和实参。可以使用内部调用和execute过程,来运行过程。

示例:

   create or replace procedure ins_sal(increase number)

as

begin

update emp set sal=sal*(100+increase)/100;

commit;

end;

/

 

execute ins_sal(10);

 

 

函数与过程概念类似,但需要通过return语句返回一个值,无法使用execute来调用。

示例:

SQL> create or replace function odd_even(v1 number)

  2  return varchar2

  3  as

  4  begin

  5     if

  6             mod(v1,2)=0

  7     then

  8             return 'even';

  9     else

 10             return 'odd';

 11     end if;

 12  end odd_even;

 13  /

 

函数已创建。

 

SQL> select odd_even(8) from dual;

 

ODD_EVEN(8)

-----------------------------------

 

Even

SQL> select odd_even(9) from dual;

 

ODD_EVEN(9)

-----------------------------------

 

odd

2.2 程序包

    程序包是若干个过程和函数的集合,由规范和主体这两个对象组成。

程序包规范:列出了程序包中各种函数与过程以及他们的调用规范,此外还定义了程序包中所有函数和过程都可以访问的变量和常量。

程序包主体:包括实现这个程序包的PLSQL代码,也就是创建过程和函数的代码。

示例:

创建程序包规范

SQL> CREATE or replace PACKAGE numbers as

  2  function odd_even(v1 number) return varchar2;

  3  procedure ins_ints(v1 in number);

  4  end;

  5  /

 

程序包已创建。

 

创建程序包主体

SQL> CREATE or replace PACKAGE BODY numbers

  2  as

  3  function odd_even(v1 number)

  4  return varchar2

  5  as

  6     begin

  7             if

  8                     mod(v1,2)=0

  9             then

 10                     return 'even';

 11             else

 12                     return 'odd';

 13             end if;

 14     end odd_even;

 15

 16  procedure ins_ints(v1 in number)

 17  as

 18     begin

 19             for i in 1..v1 loop

 20                     insert into integers values(i,odd_even(i));

 21             end loop;

 22     end ins_ints;

 23  end;

 24  /

 

程序包体已创建。

 

检验结果

SQL> desc numbers;

PROCEDURE INS_INTS

参数名称                       类型                    输入/输出默认值?

------------------------------ ----------------------- ------ --------

 V1                             NUMBER                  IN

FUNCTION ODD_EVEN RETURNS VARCHAR2

参数名称                       类型                    输入/输出默认值?

------------------------------ ----------------------- ------ --------

 V1                             NUMBER                  IN

 

SQL> execute numbers.ins_ints(5);

 

PL/SQL 过程已成功完成。

 

SQL> select * from integers;

 

        C1 C2

---------- -----

         1 odd

         2 even

         3 odd

         4 even

         5 odd

 

3、  触发器

触发器是一种特殊的PLSQL对象,但是我们无法手动调用这种对象。触发器是自动运行的。

触发器可以被配置为在事前触发或事后触发。

常见的触发事件:

Insert, UPDATEDELETEDML命令。

CREATE, DROP, ALTERTRUCATEDDL命令。

。会话登入与登出。

。数据库的启动和关闭。

。由于空间问题导致的某条语句的挂起。

。检测到服务器错误。

Select语句不会引起触发事件。

触发器的应用

审计用户的动作。

执行复杂的编辑。

安全性。

实施复杂的约束。

触发器最好完成少量的工作,过程则用于执行批量工作。

示例:

创建触发器

SQL> CREATE or replace trigger oe_check

  2  after insert or update on integers

  3  for each row

  4     begin

  5             if

  6                     mod(:new.c1,2)=0

  7             then

  8                     dbms_output.put_line(:new.c1|| ' is even');

  9             else

 10                     dbms_output.put_line(:new.c1|| ' is odd');

 11             end if;

 12     end;

 13  /

 

触发器已创建

 

测试触发器

SQL> set serveroutput on;

SQL> insert into integers values(2,'odd');

2 is even

已创建 1 行。

SQL> rollback;

 

回退已完成。

 

SQL> insert into integers values(3,'odd');

3 is odd

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

4、  用于PL/SQL的实例参数

PLSQL_V2_COMPATIBILITY(DEFAULTFAULSE):用于向后兼容。

PLSQL_DEBUG(DEFAULTFAULSE):是否编译PL/SQL代码。

PLSQL_OPTIMIZE_LEVEL(DEFAULT2):用于优化。

PLSQL_WARNING(DEFAULTDISABLE:ALL)PLSQL编译器是否显示信息。

PLSQL_CODE_TYPE(DEFAULTINTERPERETED)PLSQL代码被编译成何种类型(置为INTERPERETED则编译成字节代码)

PLSQL_NATIVE_LIBRARY_DIR(DEFAULT NULL) :指定存储本地 PLSQL 编译所生成的连接库的操作系统路径。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9537053/viewspace-721834/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9537053/viewspace-721834/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值