PLSQL
是Oracle公司在SQL基础上进行扩展而成的一种过程语言。PLSQL提供了典型的高级语言特性,包括封装,例外处理机制,信息隐藏,面向对象等;并把最新的编程思想带到了数据库服务器和工具
集中。 与Java, C#相比 ,PLSQL的优势是:SQL语言可以直接写到PLSQL的“块”中或者是PLSQL的过程、函数中。没有必要向java那样先创建Statement对象来执行SQL; 这使得PLSQL成为很强大的事务处理语言,即:使用SQL来处理数据,使用控制结构来处理业务逻辑。
PLSQL在Oracle 数据库服务器(在存储过程、函数、数据库触发器,Package包中使用)和Oracle开发 工具集(在开发工具组件的触发器中使用);Form Developer,Report Developer 还可以使用共享库(包含使用PLSQL写的过程和函数,扩展名为PLL的文件); SQL数据类型也可以在PLSQL中使用,结合 SQL提供者的直接访问,这些共享数据类型整合了PLSQL和Oracle的数据库字典。PLSQL消除了存取数据库的便利性与过程语言之间的障碍。
PLSQL的块包括三种:匿名块、存储函数、函数
PLSQL变量声明:
语法:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]
例子:
DECLARE
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL := 10;
v_location VARCHAR2(13) := ‘Atlanta’;
c_comm CONSTANT NUMBER := 1400;
变量命名建议:
1、v_name表示一个变量,c_name表示一个常量
2、每一行声明一个变量,可读性比较好
3、命令避免与数据库字段名相同
DECLARE
employee_id NUMBER(6);
BEGIN
SELECT employee_id
INTO employee_id --变量名和字段名相同,可以给变量加一个v_
FROM employees
WHERE last_name = 'name';
END;
将变量类型声明为表中的字段类型相同
identifier Table.column_name%TYPE;
举例:
v_name emp.last_name%type;
变量输出:DBMS_OUTPUT.PUT_LINE()类似printf()
DECLARE
v_sal NUMBER
BEGIN
v_sal := 12;
DBMS_OUTPUT.PUT_LINE (v_sal);
END;
注释语句
1、多行注释类似java:/* 注释的内容 */
2、单行注释使用:- -
SQL函数在PLSQL语句中的使用
不能使用:Decode函数、分组函数(avg,min,max,count,sum,stddev,and variance)等
PLSQL块是可以嵌套的,作用范围与其他语言类似
…
x number;
begin
declare
y number
begin
y:=x;
end;
end;
select into 语句:用于把从数据库查询出来的内容存入变量中
begin
select x,y - -查询出来的x,y字段
into v_x,v_y,将x,y存入声明的v_x,v_y变量
end
PLSQL中的控制语句
和其他语言一样,主要包括判断和循环
if判断语句
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
循环
1、基本循环
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;
2、for循环
WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;
举例:
FOR i IN 1…3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_location_id + i), v_city, v_country_id );
END LOOP;
3、while循环
FOR counter IN [REVERSE]
lower_bound…upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;
4、嵌套循环
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Inner_loop>>
LOOP
…
EXIT Outer_loop WHEN total_done = ‘YES’;
– Leave both loops
EXIT WHEN inner_done = ‘YES’;
– Leave inner loop only
…
END LOOP Inner_loop;
…
END LOOP Outer_loop;
PLSQL例外处理
BEGIN
. . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
END;
PLSQL中的包package
Package组成:Package由包说明(package Specification)和包体(package body)两部分构成; 包说明部分相当于C语言里面的.H文件,包体部分相当于 C语言里面针对.H实现的C文件。
package常用SQL
1、创建包
create [or replace] package
2、包体
create [or replace] package body
package好处
1、模块化:一般把有相关性的函数和过程放到一个Package中;
2、易设计:可以把包说明和包体分别编写和编译,先编写和编译包说明部分,在编写和说明包体部分;这有利于分工合作;
3、信息隐藏:包体中函数可以部分出现在包说明中,只有出现在包说明中的函数和过程才是该Package的公有函数和过程,可以被其他包中的函数调用,否则对其他包中的函数是不可见的,未在包说明部分出现的函数和过程相当于私有的。
4、加载性能提高:当Package中有一个函数或过程被调用时,整个Packege就被加载到内存中,这样当该Package中其他函数被调用时,就直接从内存读取了,可以减少磁盘IO,从而提高性能。 这个特性也提醒我们不要去搞巨无霸的Package, 把你用到的任何 函数都写到一个Package中,这会导致严重的内存浪费。
5、重载:一个package 中可以定义同名、不同参数的函数或过程。