33
第 14 第 PL/SQL 第 JDBC 第第第第

第 14 章 PL/SQL 与 JDBC 程序设计

  • 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

Page 1: 第 14 章 PL/SQL 与 JDBC 程序设计

第 14章 PL/SQL与 JDBC程序设计

Page 2: 第 14 章 PL/SQL 与 JDBC 程序设计

本章简介

• 本章介绍 Oracle PL/SQL 程序设计语言。• 通过示例,介绍在 JSP 中使用 JDBC 调用

PL/SQL 过程和函数的方法和步骤。

Page 3: 第 14 章 PL/SQL 与 JDBC 程序设计

14.1 PL/SQL 程序设计 14.1.1 程序结构 一般地, PL/SQL 块具有以下语法结构:[DECLARE

declaration_statements]BEGIN

executable_statements[EXCEPTION

exception_handing_statements]END;

Page 4: 第 14 章 PL/SQL 与 JDBC 程序设计

( 1 ) declaration_statement —— 被包含在声明块中,声明了在块的其余部分中使用的变量。这些变量是块的局部变量,所以不能在块外引用它们。声明总是放在块的最前面。

( 2 ) executable_statement —— 块的可执行语句,包括执行循环、条件逻辑等语句。

( 3 ) exception_handing_statement —— 处理执行语句可能发生的错误。

( 4 )每个语句都以分号(;)结尾,块使用 END关键字结尾。

Page 5: 第 14 章 PL/SQL 与 JDBC 程序设计

示例:计算一个圆的面积。启动 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 过程已成功完成。

Page 6: 第 14 章 PL/SQL 与 JDBC 程序设计

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;

Page 7: 第 14 章 PL/SQL 与 JDBC 程序设计

表 14.1 常用的 Oracle 数据类型 类型名称 类型说明

CHAR(length) 存储固定长度的字符串, length参数指定字符串的长度

VARCHAR2(length)

存储可变长度的字符串, length参数指定字符串的最大长度

DATE 存储日期和时间,存储格式是 4位的年份,月、日、小时、分和秒

INTEGER 存储整型数

NUMBER(precision,scale)

存储浮点数,也可用于整型数。 precision是这个数可能使用的最大位数(包括小数点前后的位数); scale是小数点右边的最大位数

Page 8: 第 14 章 PL/SQL 与 JDBC 程序设计

14.1.3 条件逻辑 • 条件逻辑的一般语法:IF condition1 THEN

statements1

ELSEIF condition2 THEN

statement2

ELSE

Statement3

END IF;

Page 9: 第 14 章 PL/SQL 与 JDBC 程序设计

示例:求 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));

Page 10: 第 14 章 PL/SQL 与 JDBC 程序设计

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 过程已成功完成

Page 11: 第 14 章 PL/SQL 与 JDBC 程序设计

14.1.4 循环 1 .简单循环简单循环一直运行到显式地结束循环为止。

其一般语法如下:LOOP

statements

END LOOP;

Page 12: 第 14 章 PL/SQL 与 JDBC 程序设计

示例:计算 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;

Page 13: 第 14 章 PL/SQL 与 JDBC 程序设计

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 过程已成功完成。

Page 14: 第 14 章 PL/SQL 与 JDBC 程序设计

2 . WHILE 循环

WHILE 循环一直运行到出现指定的条件为止。 WHILE 循环的一般语法如下:

WHILE condition LOOP

statements

END LOOP;

Page 15: 第 14 章 PL/SQL 与 JDBC 程序设计

示例:计算 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 过程已成功完成。

Page 16: 第 14 章 PL/SQL 与 JDBC 程序设计

3 . FOR 循环

FOR 循环的一般语法如下:FOR loop_variable IN [REVERSE] lower_bo

und..upper_bound LOOP

statements

END LOOP;

Page 17: 第 14 章 PL/SQL 与 JDBC 程序设计

示例:求 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 过程已成功完成。

Page 18: 第 14 章 PL/SQL 与 JDBC 程序设计

14.2 从 JSP 调用 PL/SQL 过程

• 本节首先介绍 PL/SQL 过程,然后通过一个示例,说明在 JSP 页面中使用 JDBC 调用 PL/SQL 过程的方法和步骤。

Page 19: 第 14 章 PL/SQL 与 JDBC 程序设计

14.2.1 创建 PL/SQL 过程

• 过程是根据逻辑分组的 SQL 和 PL/SQL 的语句集,用于执行特定的任务。

• 存储过程是存储在数据库中的编译后的过程,一旦存储,这个过程就称为一个模式对象(既特定的数据库对象)。

Page 20: 第 14 章 PL/SQL 与 JDBC 程序设计

过程的主要优点是: ( 1 )过程是模块化的,能够将程序分割成

定义清晰、易于管理的单元。( 2 )由于过程是被储存在数据库中,所以

可以重用。而且过程经过验证后,可以反复使用,无需重新编译并通过网络分发。

( 3 )通过让用户只能通过存储过程访问数据库,可以限制对数据库的访问。

( 4 )过程利用了共享内存资源。

Page 21: 第 14 章 PL/SQL 与 JDBC 程序设计

PL/SQL 过程的一般语法如下 CREATE TABLE [OR REPLACE] PROCED

URE procedure_name[(parameter_name [IN|OUT|IN OUT] type [,

…])]{IS | AS}{

body};

Page 22: 第 14 章 PL/SQL 与 JDBC 程序设计

• 示例:• 创建一个表 products ,其创建命令如下:CREATE TABLE products (

id INTEGER PRIMARY KEY,

name VARCHAR2(30) NOT NULL,

description VARCHAR2(50),

price NUMBER(5, 2)

);

Page 23: 第 14 章 PL/SQL 与 JDBC 程序设计

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;/

Page 24: 第 14 章 PL/SQL 与 JDBC 程序设计

14.2.2 使用 JDBC 调用 PL/SQL 过程

( 1 )创建一个 CallableStatement 对象。• 第一步,需要创建一个 CallableStatement

对象,这其中包含了对 PL/SQL 过程的调用。例如,下面的语句:

CallableStatement myCS = myConnection.prepareCall("{ call update_price(?,?) }");

Page 25: 第 14 章 PL/SQL 与 JDBC 程序设计

( 2 )如果需要,为 PL/SQL 过程提供参数• 第二步,使用 set 方法为 CallableStatemen

t 对象的占位符提供一个值。• 例如,下面所示的第一个语句为第一个占

位符产品 id 提供一个值 1 ,第二个语句为第二个占位符产品价格的乘数因子提供一个值 1.2 。

myCS.setInt(1,1);

myCS.setDouble(2,1.2);

Page 26: 第 14 章 PL/SQL 与 JDBC 程序设计

( 3 )执行 execute( ) 方法• 第三步,执行 CallableStatement 对象的 execut

e( ) 方法,即执行 PL/SQL 过程。• 例如,下面的语句:myCS.execute( );

• 在使用完 CallableStatement 对象后,应该用 close( ) 方法关闭它。

• 例如,下面的语句:myCS.close( );

Page 27: 第 14 章 PL/SQL 与 JDBC 程序设计

14.3 从 JSP 调用 PL/SQL 函数

本节首先介绍 PL/SQL 函数,然后通过一个示例,说明在 JSP 页面中使用 JDBC 调用 PL/SQL 函数的方法和步骤。

Page 28: 第 14 章 PL/SQL 与 JDBC 程序设计

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};

Page 29: 第 14 章 PL/SQL 与 JDBC 程序设计

示例: 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;/

Page 30: 第 14 章 PL/SQL 与 JDBC 程序设计

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);

Page 31: 第 14 章 PL/SQL 与 JDBC 程序设计

( 3 )如果需要,为 PL/SQL 函数提供参数。• 第三步,使用 set 方法为 CallableStatement 对象

的占位符提供一个值。• 例如,第一个语句为第二个占位符产品 id 提供一

个值 3 ,第二个语句为第三个占位符产品价格的乘数因子提供一个值 1.2 。

myCS.setInt(2,3);

myCS.setDouble(3,1.2);

Page 32: 第 14 章 PL/SQL 与 JDBC 程序设计

( 4 )执行 execute( ) 方法。• 第四步,执行 CallableStatement 对象的 execute( ) 方法,

也就是执行 PL/SQL 函数。例如,下面的语句:myCS.execute( );

( 5 )如果需要,读取函数的返回值• 第五步,使用 get 方法读取 PL/SQL 函数的返回值。例如,

下面的语句:int result = myCS.getInt(1);

• 在使用完 CallableStatement 对象后,应该用 close( ) 方法关闭它。例如,下面的语句:

myCS.close( );

Page 33: 第 14 章 PL/SQL 与 JDBC 程序设计

14.4 本章小结 • 通过使用 JDBC 调用 PL/SQL 过程和函数,

根本性地改变了把数据库仅仅视作数据存储空间的观念。

• 实际上现在的数据库已经成为构成商务应用程序层的一个重要组成部分。而且由于PL/SQL 在数据类型上的优势,使得开发人员需要处理更复杂的数据类型时有了一个更好地选择。