oracle调用子存储过程+游标循环实例

一,有子节点的部门的子节点的排序,调用子存储过程

CREATE OR REPLACE PROCEDURE "PRO_INIT_SORT" AS
CURSOR cur_department_all IS select * from tbl_department;
VAR_COUNT NUMBER ;
VAR_OUT_COUNT NUMBER := 0;
BEGIN
  FOR department_row IN cur_department_all LOOP
    SELECT COUNT(1) INTO VAR_COUNT FROM tbl_department WHERE unit_id = department_row.unit_id AND department_supercode = department_row.department_code ;
    --上述查询的是有所有的子节点的部门
    IF VAR_COUNT != 0 THEN
      --dbms_output.put_line(department_row.unit_id||‘-‘||department_row.department_code||‘-‘||var_count);
      PRO_INIT_DEPARTMENT_SORT(department_row.unit_id , department_row.department_id) ;
    END IF ;
    VAR_OUT_COUNT := VAR_OUT_COUNT + 1 ;
  END LOOP ;
  DBMS_OUTPUT.PUT_LINE(‘总数:‘||VAR_OUT_COUNT);
END PRO_INIT_SORT ;
CREATE OR REPLACE PROCEDURE "PRO_INIT_DEPARTMENT_SORT"
(
  UNIT_ID IN NUMBER ,
  SUPER_CODE IN NUMBER
)
-- 初始化TBL_DEPARTMENT表的DEPARTMENT_SORT字段 以同DEPARTMENT_SUPERCODE方式查询使用rownum值更新DEPARTMENT_SORT字段
AS
 -- CURSOR cur_department IS SELECT * FROM tbl_department where unit_id = TARGET_UNIT_ID and department_supercode = TARGET_SUPERCODE ORDER BY department_sort ASC;
CURSOR cur_department IS SELECT rownum rn , d.* FROM tbl_department d where unit_id = UNIT_ID and department_supercode = SUPER_CODE;
BEGIN
  FOR department_row IN cur_department LOOP
    update tbl_department set department_sort = department_row.rn where department_id = department_row.department_id ;
    -- NULL ;
  END LOOP ;
--  NULL;
END PRO_INIT_DEPARTMENT_SORT;

  注意:COUNT(1)和COUNT(*)

在数据记录都不为空的时候查询出来结果上没有差别的.

但当COUNT(1)查询的那列有空的时候空的是要被去掉的不记入统计中.这样查询出来的结果是不一样的.

二,没有子节点的排序

CREATE OR REPLACE PROCEDURE "INT_SORT_N" AS
P_OUT  NUMBER;
P_COUNT NUMBER:=0;
CURSOR  CUR_DEPARTMENT IS SELECT T.UNIT_ID FROM TBL_DEPARTMENT T GROUP BY T.UNIT_ID ORDER BY T.UNIT_ID;
BEGIN
     FOR  DEP_ROW  IN CUR_DEPARTMENT  LOOP
          SELECT COUNT(1) INTO P_OUT FROM TBL_DEPARTMENT T WHERE T.UNIT_ID = DEP_ROW.UNIT_ID AND T.DEPARTMENT_SUPERCODE = 0;
          DBMS_OUTPUT.put_line(‘UID--‘||DEP_ROW.UNIT_ID||‘--部门--‘||P_OUT);
          INT_DEPARMENT_SORT(DEP_ROW.UNIT_ID);
          P_COUNT := P_COUNT + 1;
     END LOOP;
     DBMS_OUTPUT.put_line(‘总数:‘||P_COUNT);
END;

  

create or replace procedure INT_DEPARMENT_SORT(UNIT_ID2 IN NUMBER) AS
CURSOR DEPARTMENT_ALL IS SELECT rownum rn,T.* FROM TBL_DEPARTMENT T WHERE T.UNIT_ID = UNIT_ID2 AND T.DEPARTMENT_SUPERCODE = 0 ORDER BY T.DEPARTMENT_ID;
begin
      FOR DEP_ROW IN DEPARTMENT_ALL LOOP
          --dbms_output.put_line(‘---‘||UNIT_ID2);
          UPDATE TBL_DEPARTMENT T SET T.DEPARTMENT_SORT = DEP_ROW.RN WHERE T.DEPARTMENT_ID = DEP_ROW.DEPARTMENT_ID;
      END LOOP;
end INT_DEPARMENT_SORT;

  

时间: 2024-08-03 14:38:57

oracle调用子存储过程+游标循环实例的相关文章

SQL存储过程+游标 循环批量()操作数据

本人收集的,挺有用的 1. 利用游标循环更新.删除MemberAccount表中的数据 DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中 OPEN My_Cursor; --打开游标 FETCH NEXT FROM My_Cursor ; --读取第一行数据 WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE dbo.MemberAccount SE

存储过程 游标使用实例

使用游标对记录集循环进行处理的时候一般操作如以下几个步骤:1.把记录集传给游标; 2.打开游标:3.开始循环:4.从游标中取值:5.检查那一行被返回:6.数据处理:7.关闭循环:8.关闭游标. 如下示例: DECLARE  CURSOR FirstCursor IS --声明显示游标,并指定结果集  SELECT T.ACC_NUM ACC_NUM,t.ext_prod_id EXT_PROD_ID, COUNT(1) COUNT,SYSDATE AUDI_TIME  FROM (SELECT

ORACLE 11G在存储过程里面遍历游标, 调用job任务定时执行

ORACLE存储过程里游标遍历.调用job定时执行 1,第一种使用For 循环 for循环是比较简单实用的方法. 首先,它会自动open和close游标.解决了你忘记打开或关闭游标的烦恼. 其次,自动声明一个记录类型及定义该类型的变量,并自动fetch数据到这个变量. 注意C_ROW 这个变量无需要在循环外进行声明,无需为其指定数据类型.它是一个记录类型,具体的结构是由游标决定的. 这个变量的作用域仅仅是在循环体内. 最后,与该游标关联的所有记录都已经被取回后,循环无条件结束,不必判定游标的%N

PHP调用MYSQL存储过程实例

PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");mysql_select_db('test',$conn);$sql = "create procedure myproce()beginINSERT IN

Oracle存储过程,游标使用

Oracle存储过程: 语法: CREATE [OR REPLACE] PROCEDURE procedure_name (arg1 [mode1] datatype1,arg2 [mode2] datatype2,...) IS [AS] PL/SQL BLOCK; mode用于指定输入输出参数:IN为输入参数,OUT为输出参数,当为输入参数时可以省去IN,OUT不能省去. 如果没有输入输出参数,可以省去 (arg1 [mode1] datatype1,arg2 [mode2] datatyp

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

ORACLE游标循环【转】

ORACLE游标循环有几种用法,下面分别介绍一下. 首先定义游标和变量 CURSOR C1 IS SELECT  eNAME,ejob FROM emp WHERE deptno=10; v_NAME VARCHAR2(10); v_job VARCHAR2(10); 第一种:使用loop 循环 open c1; loop fetch c1 into v_name,v_job ; exit when c1%notfound; …… end loop colse c1; 这里需要注意,exit w

Oracle调用Java类开发的存储过程、函数的方法

oracle调用java类的基本步骤 1. 编写java代码,后续可以直接使用java代码,class文件或者jar包 2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用loadjava命令:另一种是在编写PL/SQL的时候编写 3. 编写存储过程.函数 来封装java代码,以实现后面对java功能的调用 4. 调用写好的存储过程和oracle函数 loadjava命令介绍 有关loadJava的各个参数的意思,可以使用:loadjava -help 命令来获得详细帮助

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while