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, UPDATE和DELETE等DML命令。
。CREATE, DROP, ALTER和TRUCATE等DDL命令。
。会话登入与登出。
。数据库的启动和关闭。
。由于空间问题导致的某条语句的挂起。
。检测到服务器错误。
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(DEFAULT为FAULSE):用于向后兼容。
。PLSQL_DEBUG(DEFAULT为FAULSE):是否编译PL/SQL代码。
。PLSQL_OPTIMIZE_LEVEL(DEFAULT为2):用于优化。
。PLSQL_WARNING(DEFAULT为DISABLE:ALL):PLSQL编译器是否显示信息。
。PLSQL_CODE_TYPE(DEFAULT为INTERPERETED):PLSQL代码被编译成何种类型(置为INTERPERETED则编译成字节代码)
。PLSQL_NATIVE_LIBRARY_DIR(DEFAULT为NULL):指定存储本地PLSQL编译所生成的连接库的操作系统路径。来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9537053/viewspace-721834/ ,如需转载,请注明出处,否则将追究法律责任。