Oracle数据库的存储过程结合游标使用

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;

猜你喜欢

转载自blog.csdn.net/qq_49023625/article/details/126892688