Oracle存储过程详解(一)
来源:互联网 发布:四大行网络银行业务 编辑:程序博客网 时间:2024/05/22 03:27
存储过程创建语法:
create [or replace] procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围);变量2 类型(值范围);Begin Select count(*) into 变量1 from 表A where列名=param1; If (判断条件) then Select 列名 into 变量2 from 表A where列名=param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if;Exception When others then Rollback;End;
注意事项:
- 存储过程参数不带取值范围,in表示传入,out表示输出
- 变量带取值范围,后面接分号
- 在判断语句前最好先用count(*)函数判断是否存在该条操作记录
- 用select … into … 给变量赋值
- 在代码中抛异常用 raise+异常名
已命名的异常:
基本语法
1. 基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGIN --执行体END 存储过程名字;
2. SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END;
3. IF 判断
IF V_TEST=1 THEN BEGIN do something END; END IF;
4. while 循环
WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP;
5. 变量赋值
V_TEST := 123;
6. 用for in 使用cursor
IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP; END;
7. 带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER;
8. 用pl/sql developer debug
连接数据库后建立一个Test WINDOW,在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
关于oracle存储过程的若干问题备忘
1.在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确select a.appname from appinfo as a;-- 错误
也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement
3.在利用select…into…语法时,必须先确保数据库中有该条记录,否则会报出”no data found”异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select…into…
4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
--正确select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;--错误select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 运行阶段报错,提示ORA-01422:exact fetch returns more than requested number of rows
5.在存储过程中,关于出现null的问题
假设有一个表A,定义如下:
create table A(id varchar2(50) primary key not null,vcount number(8) not null,bid varchar2(50) not null -- 外键 );
如果在存储过程中,使用如下语句:
select sum(vcount) into fcount from A where bid='xxxxxx';
如果A表中不存在bid=”xxxxxx”的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
if fcount is null then fcount:=0;end if;
这样就一切ok了。
6.Hibernate调用oracle存储过程
this.pnumberManager.getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { CallableStatement cs = session .connection() .prepareCall("{call modifyapppnumber_remain(?)}"); cs.setString(1, foundationid); cs.execute(); return null; } });
1 0
- Oracle存储过程详解(一)
- Oracle存储过程详解(一)
- oracle存储过程一
- oracle存储过程详解
- oracle存储过程详解
- Oracle存储过程详解
- Oracle存储过程详解
- Oracle存储过程详解
- Oracle存储过程详解
- Oracle存储过程详解
- Oracle存储过程详解
- oracle存储过程一例
- oracle 存储过程学习一
- oracle存储过程写法(一)
- Oracle一存储过程总结
- oracle中存储过程详解
- Oracle存储过程详解(自己)
- oracle中存储过程详解
- linux 启动tomcat的问题
- HTTP 中 get 与 post 的区别
- 二叉树的创建--(2)运算符重载<<、>>以及CreateBinaryTree、Traverse、PrintBTree函数
- JFrame基本操作,增加选择文件按钮
- html中<!DOCTYPE>标签
- Oracle存储过程详解(一)
- TCP和TCP/IP的区别
- 关于C语言中无符号与有符号数之间运算问题
- findViewById(R.id.xx)使用位置的放置!
- MD5算法的C++实现
- 安装hbase后重启服务,发现zookeeper在某台机器上无法正常启动
- Java7新特性--try-with-resources,自动关闭资源
- android开发百度地图黑屏闪退现象解决办法
- jsp结合fckeditor使用的小demo分享