Oracle在数据库中引入了一种过程化编程语言,称为PL/SQL(Procedural Language/SQL).PL/SQL构建与SQL之上,可以用来编写包含SQL语句程序。其中包含这类语言的标准编程结构如下:
通常,PL/SQL用于向数据库中加入业务逻辑。这种集中化的代码可以由任何能够访问数据库的程序调用,其中就包括C程序和Java程序。
块结构
PL/SQL程序可划分成称为块的结构,每一个块包含有PL/SQL和SQL语句。典型的PL/SQL代码包含如下的结构:
[DECLARE declaration_statements ] BEGIN executable_statements [EXCEPTION exception_handing_statements ] END;
声明和异常块是可选的,上述语法中的解释如下:
每一条语句都有分号结尾,整个块由关键字END标志结束。先看一个简单的例子:
-- Created on 2010-5-20 by ADMINISTRATOR declare -- Local variables here width INTEGER; height INTEGER:=2; area INTEGER; i integer; begin -- Test statements here area:=6; width:=area/height; DBMS_OUTPUT.put_line('width='||width); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.put_line('Division by zero'); end;
变量和类型
变量声明中包含名称和类型,还可以通过%TYPE关键字定义变量类型,这个关键字告诉PL/SQL使用与表中指定列相同的类型。下面这个例子用%TYPE声明了一个变量,这个变量类型与product表中price列类型相同。
product_price product.price%TYPE
条件逻辑
在PL/SQL中,IF、THEN、ELSE、ELSIF和ENDIF等关键字用于执行条件逻辑。下面的语法说明了条件逻辑的用法:
IF condition1 THEN statement1 ELSIF condition2 THEN statement2 ELSE statement3 END IF;
循环
PL/SQL中包含三种循环:
简单循环:直到显式结束循环前一直运行。
WHILE循环:直到某个特定条件出现之前一直运行。
FOR循环:运行预先确定的次数。
简单循环
LOOP statements END LOOP;
要结束简单循环,可以使用EXIT或者EXIT WHEN语句。EXIT语句立即结束循环,EXIT WHEN语句在指定条件出现时结束循环。 举个简单例子:
LOOP counter:=counter+1; EXIT WHEN counter=5; END LOOP;
WHILE循环
WHILE循环在某个特定条件出现之前一直运行。
举个例子:
counter=0; WHILE counter<6 LOOP counter:=counter+1; END LOOP;
FOR循环
FOR循环会运行预先确定的次数,可通过给循环变量指定上限和下限来确定循环运行的次数,然后,循环变量在每次循环中递增或递减。语法如下:
FOR loop_variable IN [REVERSE] lower_bound ..upper_bound LOOP statements END LOOP;
如果使用了REVERSE则loop_variable每次减少1。
游标
当SELECT语句从数据库中返回的记录多余一条时,就可以使用游标。使用游标需要遵循以下5个步骤:
(1)声明一些变量,用于保存SELECT语句返回的列值。
(2)声明游标,并指定SELECT语句。
(3)打开游标。
(4)从游标中获取记录。
(5)关闭游标。
declare v_username amc_base_user.user_name%TYPE; CURSOR v_user_cursor IS SELECT user_name FROM amc_base_user; begin OPEN v_user_cursor; LOOP FETCH v_user_cursor INTO v_username; EXIT WHEN v_user_cursor%NOTFOUND; DBMS_OUTPUT.put_line(v_username); END LOOP; CLOSE v_user_cursor; end;
注意:
1 声明完游标后此时游标并未打开,只有OPEN的时候才打开。
2 为了确定循环是否结束,可以使用布尔变量%NOTFOUND。当FETCH语句到达游标的最后一条记录时,这个变量为真。
3 游标使用完之后要及时关闭掉。
利用FOR循环的功能,可以增强在游标中访问记录的能力。当使用FOR循环时,可以不显式地打开和关闭游标----FOR循环会自动执行这些操作。
declare v_username amc_base_user.user_name%TYPE; CURSOR v_user_cursor IS SELECT user_name FROM amc_base_user; begin FOR v_u IN v_user_cursor LOOP DBMS_OUTPUT.put_line(v_u.user_name); END LOOP; end;