Upload
doria
View
155
Download
0
Embed Size (px)
DESCRIPTION
第 14 章 PL/SQL 与 JDBC 程序设计. 本章简介. 本章介绍 Oracle PL/SQL 程序设计语言。 通过示例,介绍在 JSP 中使用 JDBC 调用 PL/SQL 过程和函数的方法和步骤。. 14.1 PL/SQL 程序设计. 14.1.1 程序结构 一般地, PL/SQL 块具有以下语法结构: [DECLARE declaration_statements ] BEGIN executable_statements [EXCEPTION exception_handing_statements ] END;. - PowerPoint PPT Presentation
Citation preview
第 14章 PL/SQL与 JDBC程序设计
本章简介
• 本章介绍 Oracle PL/SQL 程序设计语言。• 通过示例,介绍在 JSP 中使用 JDBC 调用
PL/SQL 过程和函数的方法和步骤。
14.1 PL/SQL 程序设计 14.1.1 程序结构 一般地, PL/SQL 块具有以下语法结构:[DECLARE
declaration_statements]BEGIN
executable_statements[EXCEPTION
exception_handing_statements]END;
( 1 ) declaration_statement —— 被包含在声明块中,声明了在块的其余部分中使用的变量。这些变量是块的局部变量,所以不能在块外引用它们。声明总是放在块的最前面。
( 2 ) executable_statement —— 块的可执行语句,包括执行循环、条件逻辑等语句。
( 3 ) exception_handing_statement —— 处理执行语句可能发生的错误。
( 4 )每个语句都以分号(;)结尾,块使用 END关键字结尾。
示例:计算一个圆的面积。启动 SQL * Plus ,输入并执行下面 PL/SQL 程序:SQL> set serveroutput onSQL> DECLARE 2 r INTEGER:=6; 3 area NUMBER(5,2); 4 begin 5 area:=3.14*r*r; 6 DBMS_OUTPUT.PUT_LINE(' 圆的面积 = ' || a
rea); 7 END; 8 /圆的面积 = 113.04PL/SQL 过程已成功完成。
14.1.2 变量和类型 < 变量名 > < 数据类型 > [NOT NULL][:= | DEFAULT < 初
始值 >];< 常量名 > CONSTANT < 数据类型 > [NOT NULL][:= | DE
FAULT < 初始值 >]; 下面是变量声明的示例:DECLARE
n_var1 NUMBER(2):=30;c_var2 CHAR(12) DEFAULT 'Hello World';
下面是常量声明的示例:DECLAREs_score CONSTANT NUMBER(3):=500;
表 14.1 常用的 Oracle 数据类型 类型名称 类型说明
CHAR(length) 存储固定长度的字符串, length参数指定字符串的长度
VARCHAR2(length)
存储可变长度的字符串, length参数指定字符串的最大长度
DATE 存储日期和时间,存储格式是 4位的年份,月、日、小时、分和秒
INTEGER 存储整型数
NUMBER(precision,scale)
存储浮点数,也可用于整型数。 precision是这个数可能使用的最大位数(包括小数点前后的位数); scale是小数点右边的最大位数
14.1.3 条件逻辑 • 条件逻辑的一般语法:IF condition1 THEN
statements1
ELSEIF condition2 THEN
statement2
ELSE
Statement3
END IF;
示例:求 3 个数中最大的数。SQL> set serveroutput on;
SQL> DECLARE
2 x NUMBER:=10;
3 y NUMBER:=6;
4 z NUMBER:=32;
5 BEGIN
6 IF x>y THEN
7 IF x>z THEN
8 DBMS_Output.Put_Line(' 最大的数为: '||To_Char(x));
9 ELSE
10 DBMS_Output.Put_Line(' 最大的数为: '||To_Char(z));
11 END IF;
12 ELSE IF y>z THEN
13 DBMS_Output.Put_Line(' 最大的数为: '||To_Char(y));
14 ELSE
15 DBMS_Output.Put_Line(' 最大的数为: '||TO_CHAR(z));
16 END IF;
17 END IF;
18 END;
19 /
最大的数为: 32
PL/SQL 过程已成功完成
14.1.4 循环 1 .简单循环简单循环一直运行到显式地结束循环为止。
其一般语法如下:LOOP
statements
END LOOP;
示例:计算 1+2+3+…+100 的值 。SQL> set serveroutput on;
SQL> DECLARE
2 n1 NUMBER:=0;
3 n2 NUMBER:=1;
4 BEGIN
5 LOOP
6 n1:=n1+n2;
7 n2:=n2+1;
8 IF n2>100 THEN
9 EXIT;
10 END IF;
11 END LOOP;
12 DBMS_Output.Put_Line(n1);
13 END;
14 /
5050
PL/SQL 过程已成功完成。
2 . WHILE 循环
WHILE 循环一直运行到出现指定的条件为止。 WHILE 循环的一般语法如下:
WHILE condition LOOP
statements
END LOOP;
示例:计算 1+2+3+…+100 的值。 SQL> set serveroutput on;SQL> DECLARE 2 n1 NUMBER:=0; 3 n2 NUMBER:=1; 4 BEGIN 5 WHILE N2<=100 LOOP 6 n1:=n1+n2; 7 n2:=n2+1; 8 END LOOP; 9 DBMS_Output.Put_Line(n1); 10 END;11 /5050PL/SQL 过程已成功完成。
3 . FOR 循环
FOR 循环的一般语法如下:FOR loop_variable IN [REVERSE] lower_bo
und..upper_bound LOOP
statements
END LOOP;
示例:求 1 ~ 6 !。 SQL> set serveroutput on;SQL> DECLARE 2 v_factorial NUMBER:=1; 3 BEGIN 4 FOR v_loopcounter IN 1..6 LOOP 5 v_factorial:=v_factorial*v_loopcounter; 6 DBMS_Output.Put_Line(v_loopcounter || ' factorial value is
:' || v_factorial) 7 END LOOP; 8 END;9 /1 factorial value is :12 factorial value is :23 factorial value is :64 factorial value is :245 factorial value is :1206 factorial value is :720PL/SQL 过程已成功完成。
14.2 从 JSP 调用 PL/SQL 过程
• 本节首先介绍 PL/SQL 过程,然后通过一个示例,说明在 JSP 页面中使用 JDBC 调用 PL/SQL 过程的方法和步骤。
14.2.1 创建 PL/SQL 过程
• 过程是根据逻辑分组的 SQL 和 PL/SQL 的语句集,用于执行特定的任务。
• 存储过程是存储在数据库中的编译后的过程,一旦存储,这个过程就称为一个模式对象(既特定的数据库对象)。
过程的主要优点是: ( 1 )过程是模块化的,能够将程序分割成
定义清晰、易于管理的单元。( 2 )由于过程是被储存在数据库中,所以
可以重用。而且过程经过验证后,可以反复使用,无需重新编译并通过网络分发。
( 3 )通过让用户只能通过存储过程访问数据库,可以限制对数据库的访问。
( 4 )过程利用了共享内存资源。
PL/SQL 过程的一般语法如下 CREATE TABLE [OR REPLACE] PROCED
URE procedure_name[(parameter_name [IN|OUT|IN OUT] type [,
…])]{IS | AS}{
body};
• 示例:• 创建一个表 products ,其创建命令如下:CREATE TABLE products (
id INTEGER PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
description VARCHAR2(50),
price NUMBER(5, 2)
);
PL/SQL 过程 update_price( ) 的定义如下所示:CREATE PROCEDURE update_price( p_product_id IN products.id%TYPE, p_factor IN NUMBER) AS product_count INTEGER;BEGIN UPDATE products SET price = price * p_factor WHERE id = p_product_id; COMMIT;END update_price;/
14.2.2 使用 JDBC 调用 PL/SQL 过程
( 1 )创建一个 CallableStatement 对象。• 第一步,需要创建一个 CallableStatement
对象,这其中包含了对 PL/SQL 过程的调用。例如,下面的语句:
CallableStatement myCS = myConnection.prepareCall("{ call update_price(?,?) }");
( 2 )如果需要,为 PL/SQL 过程提供参数• 第二步,使用 set 方法为 CallableStatemen
t 对象的占位符提供一个值。• 例如,下面所示的第一个语句为第一个占
位符产品 id 提供一个值 1 ,第二个语句为第二个占位符产品价格的乘数因子提供一个值 1.2 。
myCS.setInt(1,1);
myCS.setDouble(2,1.2);
( 3 )执行 execute( ) 方法• 第三步,执行 CallableStatement 对象的 execut
e( ) 方法,即执行 PL/SQL 过程。• 例如,下面的语句:myCS.execute( );
• 在使用完 CallableStatement 对象后,应该用 close( ) 方法关闭它。
• 例如,下面的语句:myCS.close( );
14.3 从 JSP 调用 PL/SQL 函数
本节首先介绍 PL/SQL 函数,然后通过一个示例,说明在 JSP 页面中使用 JDBC 调用 PL/SQL 函数的方法和步骤。
14.3.1 创建 PL/SQL 函数PL/SQL 函数的一般语法如下CREATE TABLE [OR REPLACE] FUNCTION funct
ion_name[(parameter_name [IN|OUT|IN OUT] type [, …])]RETURN type{IS | AS}{
body};
示例: PL/SQL 函数的定义如下所示:CREATE FUNCTION update_price_func( p_product_id IN products.id%TYPE, p_factor IN NUMBER) RETURN INTEGER AS BEGIN UPDATE products SET price = price * p_factor WHERE id = p_product_id; COMMIT; RETURN 1;END update_price_func;/
14.3.2 使用 JDBC 调用 PL/SQL 函数
( 1 )创建一个 CallableStatement 对象。• 第一步,需要创建一个 CallableStatement 对象,这其中
包含了对 PL/SQL 函数的调用。• 例如,下面的语句:CallableStatement myCS=myConnection.prepareCall("{?=c
all update_price_func(?,?)}");
( 2 )注册输出参数。• 第二步,使用 registerOutParameter( ) 方法注册 PL/SQL
函数的输出参数。• 例如,下面的语句注册 PL/SQL 函数返回的整型参数:myCS.registerOutParameter(1,java.sql.Types.INTEGER);
( 3 )如果需要,为 PL/SQL 函数提供参数。• 第三步,使用 set 方法为 CallableStatement 对象
的占位符提供一个值。• 例如,第一个语句为第二个占位符产品 id 提供一
个值 3 ,第二个语句为第三个占位符产品价格的乘数因子提供一个值 1.2 。
myCS.setInt(2,3);
myCS.setDouble(3,1.2);
( 4 )执行 execute( ) 方法。• 第四步,执行 CallableStatement 对象的 execute( ) 方法,
也就是执行 PL/SQL 函数。例如,下面的语句:myCS.execute( );
( 5 )如果需要,读取函数的返回值• 第五步,使用 get 方法读取 PL/SQL 函数的返回值。例如,
下面的语句:int result = myCS.getInt(1);
• 在使用完 CallableStatement 对象后,应该用 close( ) 方法关闭它。例如,下面的语句:
myCS.close( );
14.4 本章小结 • 通过使用 JDBC 调用 PL/SQL 过程和函数,
根本性地改变了把数据库仅仅视作数据存储空间的观念。
• 实际上现在的数据库已经成为构成商务应用程序层的一个重要组成部分。而且由于PL/SQL 在数据类型上的优势,使得开发人员需要处理更复杂的数据类型时有了一个更好地选择。