oracle存储过程介绍
存储过程优点(2)
4)重复使用。存储过程可以重复使用,从而可以减少数 据库开发人员的工作量。 5)灵活:使用存储过程,可以实现存储过程设计和编码 工作分开进行,只要将存储过程名、参数、及返回信 息告诉编码人员即可。
存储过程缺点(1)
1)移植性差:使用存储过程封装业务逻辑将限制应用程 序的可移植性; 2)维护成本高:如果更改存储过程的参数或者其返回的 数据及类型的话,需要修改应用程序的相关代码,比 较繁琐。
执行存储过程
执行存储过程语法: ,...]);
CALL/PERFORM Procedure 过程名([参数1,参数2
在PL/SQL中,数据库服务器支持在过程体中调用其他 存储过程 使用CALL或者PERFORM等方式激活存储过程的执行。 调用时”()”是不可少的,无论是有参数还是无参数。
过程名:数据库服务器合法的对象标识 参数列表:用名字来标识调用时给出的参数值,必须 指定值的数据类型。参数也可以定义输入参数、输出 参数或输入/输出参数。默认为输入参数。 过程体:是一个<PL/SQL块>。包括声明部分和可执 行语句部分 ;不用 declare 语句
创建存储过程(2)
例子: [例1] 利用存储过程来实现下面的应用: 从一个账户转指定数额的款项到 另一个账户中。 CREATE PROCEDURE TRANSFER(inAccount INT, outAccount INT , amount FLOAT) AS totalDeposit FLOAT; BEGIN /* 检查转出账户的余额 */ SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount; IF totalDeposit IS NULL THEN /* 账户不存在或账户中没有存款 */ ROLLBACK; RETURN; END IF;
前面我们已经讲述了有关oracle数据库的存储过程的 相关知识,下面我将根据上面存储过程的实例来举出 JAVA对oracle存储过程的调用
JAVA调用实例
仅有返回值的过程:
public static void main(String[] args) { Connection conn=BBConnection.getConnection(); String sql="{call stu_proc2(?)}"; try { CallableStatement statement=conn.prepareCall(sql); statement.registerOutParameter(1,Types.VARCHAR); statement.execute(); String pname=statement.getString(1); System.out.println(pname); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
打开游标
Байду номын сангаас
语法: OPEN 游标名; 在BEGIN语句之后,可以打开游标,在打开游标之前,必 须对游标所涉及到的变量赋值
利用游标提取数据
语法: FETCH 游标名 INTO 变量1,变量2,…..; 游标每次只能取到一条数据,同时游标指针下移,等待 取下一条数据.该条语句变量列表应与定义游标时的参 数列表一致
循环控制语句(1)
LOOP循环: 语法:LOOP
语句; [EXIT [WHEN 条件]]; END LOOP
循环控制语句(2)
for循环: 语法:FOR 计数器 IN [REVERSE] 下界…上界 LOOP 语句;
END LOOP
循环控制语句(3)
WHILE循环: 语法:WHILE 条件 LOOP 语句; END LOOP
执行存储过程(2)
例子: 账户中。 CALL Procedure TRANSFER(01003813828, 01003815868,10000);
[例2]从账户01003815868转一万元到01003813828
删除存储过程
删除存储过程语法:
DROP PROCEDURE 过程名;
JAVA调用数据库存储过程
pl/sql基础
PL/SQL块的基本结构(1)
基本的PL/SQL块由定义部分,执行部分,异常处理部分 组成: DECLARE 定义部分 BEGIN 执行部分 EXCEPTION 异常处理部分 END
PL/SQL块的基本结构(2)
定义部分: 定义在程序执行部分使用的常量,变量,游标和异常 处理名称 可执行部分 包括数据库操作语句和PL/SQL块控制语句 异常处理部分 对执行部分的所有PL/SQL语句的执行进行监控,如 执行发生异常,则程序跳到该部分执行
条件控制语句(2)
IF_THEN_ELSE语句 语法: IF 条件 THEN 语句; ELSE 语句; END IF; 条件可为IS NULL或NOT IS NULL以及AND, OR, NOT, 逻辑运算符
条件控制语句(3)
IF_THAN_ELSIF语句: 语法:IF 条件 THEN 语句; ELSIF 条件 THEN 语句; [ELSIF 条件 THEN 语句;] [ELSE 语句;] END IF
游标
游标是系统为用户开设的一个数据缓冲区,存放SQL语 句的执行结果 每个游标区都有一个名字 用户可以用SQL语句逐一从游标中获取记录,并赋给主 变量,交由主语言进一步处理
定义游标
语法: CURSOR 游标名称 IS SELECT 语句; 定义游标应写在PL/SQL语句的DECLARE变量定义部分 定义游标时SELECT语句中不可有INTO子语句 在SELECT语句中使用的变量必须在定义游标前定义
存储过程的概念(2)
对象,是一种带名的PL/SQL过程程序块。在ORACLE中, 若干个有联系的过程可以组合在一起构成程序包。
存储过程优点(1)
1)提高效率:存储过程是预编译过的,并且经优化后 存储于SQL内存中,使用时无需再次编译,提高了工作 效率; 2)减少网络流量:存储过程的代码直接存放于数据库 中,一般由客户端直接通过存储过程的名字进行调用, 减少了网络流量,加快了系统执行速度,例如在进行 百万以上的大批量数据查询时,使用存储过程分页要 比其他方式分页快得多; 3)安全性高:使用存储过程可以减少SQL注入式攻击, 提高了系统的安全性,执行存储过程的用户要具有一 定的权限才能使用存储过程,没有数据操作权限的用 户只能在其控制下间接地存取数据;
JAVA调用实例
既有输入参数又有输出参数的过程
public static void main(String[] args) { Connection conn=BBConnection.getConnection(); String sql="{call stu_proc3(?,?)}"; try { CallableStatement statement=conn.prepareCall(sql); statement.setInt(1, 1); statement.registerOutParameter(2,Types.VARCHAR); statement.execute(); String pname=statement.getString(2); System.out.println(pname); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
定义变量(1)
在PLSQL中所使用的变量必须在变量定义部分明确定
义.变量定义部分是包括在关键字DECLARE和BEGIN之间 的部分,每条语句后用(;)结束. 定义格式: 变量标示符 [CONSTANT] 数据类型 [NOT NULL] [:=缺省值或PLSQL表达式]; 变量标示符命名规则应遵循SQL实体命名规则
PL/SQL流程控制
PL/SQL具有与高级语言类似的流程控制语句 .PL/SQL主要控制语句有: 条件控制语句 循环控制语句 跳转控制语句
条件控制语句(1)
IF_THEN语句 语法: IF 条件 THEN
语句;
END IF; 条件可为IS NULL或NOT IS NULL以及AND, OR, NOT, 逻辑运算符
关闭游标
语法: CLOSE 游标名; 关闭游标,释放资源,游标关闭后不能再提取数据.
存储过程的用户接口
创建存储过程 执行存储过程 删除存储过程
创建存储过程
创建存储过程语法:
CREATE Procedure 过程名([参数1,参数2,...]) AS/IS <PL/SQL块>;
跳转控制语句
语法: 《标号》 其他语句; GOTO 标号; 说明:(1)跳转语句可在同一块语句间跳转 (2)跳转语句可从子块跳转倒父块中,但不能从父块跳 转到子块中 (3)跳转语句不能在IF语句体外跳到IF体内 (4)跳转语句不能从循环体外跳到循环体内
游标(cursor)
为什么要使用游标(1)
Oracle存储过程介绍
***
存储过程介绍
存储过程概念介绍 PL/SQL基础 游标 存储过程的用户接口 JAVA调用数据库存储过程 存储过程的异常处理 存储过程的包