Oracle数据库的存储过程结合游标使用
文章目录
前言
简单记录一下实习期间Oracle数据库的存储过程以及游标知识。
一、创建Oracle数据库的存储过程?
1.Oracle数据库存储过程的创建(带参数)
CREATE OR REPLACE PROCEDURE 存储过程的名字(userPhid in number) AS
BEGIN
这里填写要执行的与语句
END 存储过程的名字;
2.Oracle数据库存储过程的创建(不带参数)
CREATE OR REPLACE PROCEDURE 存储过程的名字() AS
BEGIN
这里填写要执行的与语句
END 存储过程的名字;
3.Oracle数据库存储过程基础知识
Oracle有三种参数模式:
1.in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。
2.out 模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
3.in out 表示高参数可以向该过程中传递值,也可以将某个值传出去
循环控制语句:
1、LOOP 循环:
LOOP
EXIT [WHEN 条件表达式] --循环终止条件,为ture时,退出循环,否则再次执行循环体
语句段;
END LOOP;
2、While循环:
WHILE 条件表达式 LOOP
语句段;
END LOOP;
3、FOR循环:
FOR 循环变量 in [REVERSE] 初值表达式..终值表达式 LOOP
语句段;
END LOOP;
二、Oracle数据库游标知识?
1.隐式游标
DML操作和单行SELECT语句会使用隐式游标,它们分别是:
1.插入操作:INSERT。
2.更新操作:UPDATE。
3.删除操作:DELETE。
4.单行查询操作:SELECT … INTO …。
2.显示游标
1.带参数的游标声明:
CURSOR 游标名 (参数1 数据类型,......)
IS
SELECT语句;
2.不带参数的游标声明:
CURSOR 游标名
IS
SELECT语句;
3.游标操作
1.打开游标:
在可执行部分,按以下格式打开游标:
OPEN 游标名(参数1,.....) --存在参数
或者
OPEN 游标名 --不存在参数
打开游标时,SELECT语句的查询结果就被传送到了游标工作区。
2.关闭游标:
CLOSE 游标名;
显式游标打开后,必须显式地关闭。游标一旦关闭,游标占用的资源就被释放,
游标变成无效,必须重新打开才能使用。
三、Oracle数据库存储过程结合游标使用?
CREATE OR REPLACE PROCEDURE csccgc(userPhid in number) AS
deptId number;--声明一个变量存储当前用户的部门id
orgType varchar(15);--声明一个变量存储当前组织的组织类型
parentId number;--声明一个变量存储当前组织的父级id
orgType1 varchar(15);--声明一个变量存储当前组织的组织类型
parentId1 number;--声明一个变量存储当前组织的父级id
--声明一个游标跟据存储过程传入的用户id得到部门id
cursor did is select phid_dept from pms3_spp_eval_table where phid = userPhid;
--声明一个游标跟据根据前面得到的部门id进程查询这个部门是不是一个组织
cursor org(deptid number) is select orgtype,parent_orgid from fg_orglist where phid = deptid;
--声明一个游标跟据根据前面得到的部门id进程查询这个部门的父级Id
cursor parents(parentid number) is select orgtype,parent_orgid from fg_orglist where phid = parentid;
--vrow did%rowtype;
--vrow org_type%rowtype;
BEGIN
--update req_p_d set user_bgh_qty = vrow.qty,user_bgh_amt = vrow.amt where pphid = vrow.glclxqd and phid_itemid = vrow.itemid;
--commit;
for x in did loop--游标取值 循环
--dbms_output.put_line(x.phid_dept);
deptId := x.phid_dept;
dbms_output.put_line(deptId);
END LOOP;
for y in org(deptId) loop--游标取值 循环
--dbms_output.put_line(y.orgtype);
orgType := y.orgtype;
--dbms_output.put_line(orgType);
parentId := y.parent_orgid;
--dbms_output.put_line(parentId);
END LOOP;
if orgType = 'y'--条件
then --开始执行
dbms_output.put_line(111111);
else --不满足条件开始执行
for f in parents(parentId) loop--游标取值 循环
orgType := f.orgtype;
dbms_output.put_line(orgType);
parentId := f.parent_orgid;
dbms_output.put_line(parentId);
END LOOP;
--org_type1 is select orgtype from fg_orglist where phid = parentId;
--parentId2 is select parent_orgid from fg_orglist where phid = parentId;
--if orgType == 'y'--条件
--then--执行
--else
end if;
--close did;
END csccgc;