`
taiwei.peng
  • 浏览: 235322 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle 带游标的存储过程

 
阅读更多

CREATE OR REPLACE PROCEDURE STP_TM_TIMEPROM_DTL(P_VERSION_DT IN DATE) IS

  VERSION_DT         DATE;

  V_PRODUCT_TYPE     VARCHAR2(20);

  SRC_PROVINCE_NAME  VARCHAR2(60);

  SRC_CITY_NAME      VARCHAR2(60);

  SRC_AREA_TOWN      VARCHAR2(60);

  V_SRC_ZONE         VARCHAR2(20);

  BATCH_CODE         VARCHAR2(20);

  BEGIN_TM           VARCHAR2(30);

  LAST_INDEPOT_TM    VARCHAR2(30);

  END_TIME           VARCHAR2(30);

  V_CITY_CODE        VARCHAR2(20);

  AUDIT_FLAG         VARCHAR2(20);

  EFFIC_NAME         VARCHAR2(20);

  DEST_PROVINCE_NAME VARCHAR2(60);

  DEST_CITY_NAME     VARCHAR2(60);

  DEST_AREA_TOWN     VARCHAR2(60);

  SYS_TIMESTANARD    VARCHAR2(20);

  CUR_TIMESTANARD    VARCHAR2(20);

  V_RESULT_SUM       NUMBER := 0;

 

  --用游标遍历

  CURSOR CUR_TM_TIMEPROM_DTL IS

    SELECT T.VERSION_DT,

           T.PRODUCT_TYPE,

           T.SRC_ZONE,

           T.BATCH_CODE,

           T.BEGIN_TM,

           T.LAST_INDEPOT_TM,

           T.END_TIME,

           T.DEST_CITY,

           (CASE T.AUDIT_FLAG

             WHEN '1' THEN

              '产品时效冲突'

             WHEN '2' THEN

              '班次时效冲突'

             ELSE

              '正常'

           END),

           (CASE T.PROMISE_DAY

             WHEN '1' THEN

              '即日'

             WHEN '2' THEN

              '次日'

             WHEN '3' THEN

              '隔日'

             WHEN '4' THEN

              '四日'

             WHEN '5' THEN

              '四日'

             WHEN '6' THEN

              '六日'

             WHEN '7' THEN

              '七日'

             WHEN '8' THEN

              '八日'

             WHEN '9' THEN

              '九日'

             WHEN '10' THEN

              '十日'

             WHEN '11' THEN

              '十一日'

             WHEN '12' THEN

              '十二日'

             WHEN '13' THEN

              '十三日'

             WHEN '14' THEN

              '十四日'

             WHEN '15' THEN

              '十五日'

             else

              ''

           end) || T.PROMISE_TM,

           (CASE T.AUDIT_PROMISE_DAY

             WHEN '1' THEN

              '即日'

             WHEN '2' THEN

              '次日'

             WHEN '3' THEN

              '隔日'

             WHEN '4' THEN

              '四日'

             WHEN '5' THEN

              '四日'

             WHEN '6' THEN

              '六日'

             WHEN '7' THEN

              '七日'

             WHEN '8' THEN

              '八日'

             WHEN '9' THEN

              '九日'

             WHEN '10' THEN

              '十日'

             WHEN '11' THEN

              '十一日'

             WHEN '12' THEN

              '十二日'

             WHEN '13' THEN

              '十三日'

             WHEN '14' THEN

              '十四日'

             WHEN '15' THEN

              '十五日'

             else

              ''

           end) || T.AUDIT_PROMISE_TM

      FROM OMPDW.TM_TIMEPROM_DTL T

     WHERE T.VERSION_DT = P_VERSION_DT

       AND T.SRC_ZONE IN (SELECT a.zone_code FROM omproute.tmp_main_zone a)

       AND T.DEST_CITY IN

           (SELECT DISTINCT (T.CITY_CODE) FROM TM_DISTRICT_ZONE T);

 

BEGIN

  EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_TIMERESULT';

  OPEN CUR_TM_TIMEPROM_DTL;

  LOOP

    FETCH CUR_TM_TIMEPROM_DTL

      INTO VERSION_DT,

           V_PRODUCT_TYPE,

           V_SRC_ZONE,

           BATCH_CODE,

           BEGIN_TM,

           LAST_INDEPOT_TM,

           END_TIME,

           V_CITY_CODE,

           AUDIT_FLAG,

           SYS_TIMESTANARD,

           CUR_TIMESTANARD;

  

    SELECT DISTINCT d.PROVINCE_NAME, d.CITY_NAME, d.AREA_TOWN

      INTO SRC_PROVINCE_NAME, SRC_CITY_NAME, SRC_AREA_TOWN

      FROM OMPROUTE.TM_DISTRICT_ZONE d

     WHERE d.ZONE_CODE = V_SRC_ZONE

       and ROWNUM = 1;

  

    SELECT COUNT(1)

      INTO V_RESULT_SUM

      FROM OMPROUTE.TM_DISTRICT_ZONE T

     WHERE T.EFFIC_NAME = '主城区'

       AND T.PRODUCT_CODE = V_PRODUCT_TYPE

       AND T.CITY_CODE = V_CITY_CODE

       AND ROWNUM = 1;

  

    IF (V_RESULT_SUM = 0) THEN

      DEST_PROVINCE_NAME := '';

      DEST_CITY_NAME     := '';

      DEST_AREA_TOWN     := '';

      EFFIC_NAME         := '';

    END IF;

  

    IF (V_RESULT_SUM > 0) THEN

      SELECT DISTINCT T.PROVINCE_NAME,

                      T.CITY_NAME,

                      T.AREA_TOWN,

                      T.EFFIC_NAME

        INTO DEST_PROVINCE_NAME, DEST_CITY_NAME, DEST_AREA_TOWN, EFFIC_NAME

        FROM OMPROUTE.TM_DISTRICT_ZONE T

       WHERE T.EFFIC_NAME = '主城区'

         AND T.PRODUCT_CODE = V_PRODUCT_TYPE

         AND T.CITY_CODE = V_CITY_CODE

         AND ROWNUM = 1;

    END IF;

  

    --注意这里一定要写,不能放在commit后再写,否则会多一条数据

    EXIT WHEN CUR_TM_TIMEPROM_DTL%NOTFOUND; --当游标为空跳出

  

    INSERT INTO TEMP_TIMERESULT

      (VERSION_DT,

       PRODUCT_TYPE,

       PROVINCE_NAME,

       CITY_NAME,

       AREA_TOWN,

       SRC_ZONE,

       BATCH_CODE,

       BEGIN_TM,

       LAST_INDEPOT_TM,

       END_TIME,

       DEST_PROVINCE_NAME,

       DEST_CITY_NAME,

       CITY_CODE,

       DEST_AREA_TOWN,

       EFFIC_NAME,

       AUDIT_FLAG,

       SYS_TIMESTANARD,

       BASE_TIMESTANARD,

       CUR_TIMESTANARD)

    values

      (VERSION_DT,

       (CASE trim(V_PRODUCT_TYPE) WHEN 'T1' THEN '顺丰即日(干线)' WHEN 'T4' THEN

        '顺丰次日' WHEN 'T6' THEN '顺丰隔日' WHEN 'T8' THEN '顺丰次晨' WHEN 'SP4' THEN

        '顺丰次日(陆运件)' ELSE '' END),

       SRC_PROVINCE_NAME,

       SRC_CITY_NAME,

       SRC_AREA_TOWN,

       V_SRC_ZONE,

       BATCH_CODE,

       BEGIN_TM,

       LAST_INDEPOT_TM,

       END_TIME,

       DEST_PROVINCE_NAME,

       DEST_CITY_NAME,

       V_CITY_CODE,

       DEST_AREA_TOWN,

       EFFIC_NAME,

       AUDIT_FLAG,

       SYS_TIMESTANARD,

       CUR_TIMESTANARD,

       CUR_TIMESTANARD);

  

    COMMIT;

  

  END LOOP;

  CLOSE CUR_TM_TIMEPROM_DTL;

 

EXCEPTION

  WHEN OTHERS THEN

    dbms_output.put_line(V_SRC_ZONE);

END STP_TM_TIMEPROM_DTL;

 

分享到:
评论

相关推荐

    ORACLE 游标 异常 存储过程

    在本篇讨论中,我们将深入理解Oracle游标、异常处理以及如何在存储过程中使用它们。 1. **Oracle游标**: - **定义**:Oracle游标是数据库系统提供的一种机制,用于在结果集中定位并处理单条记录。它实际上是一个...

    Oracle 数据库游标使用大全

    在Oracle中,游标对于实现复杂的数据操作和控制流程至关重要,特别是在存储过程和触发器中。 1. **游标简介** 游标提供了一种方式来遍历查询结果集,并允许应用程序一次处理一行。游标有显式和隐式两种类型。显式...

    oracle 隐式游标,显示游标,游标循环

    - `FETCH`语句用于从游标中获取数据,并将其存储到变量`v_employee`中。 - 使用`c_employees%NOTFOUND`来判断是否还有数据可取。 ##### 5. 关闭游标 ```sql CLOSE c_employees; ``` #### 四、游标循环 游标循环是...

    Oracle存储过程游标详解

    "Oracle存储过程游标详解" Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步...

    oracle数据库游标使用例子

    以下是关于Oracle游标使用的一些关键知识点: 1. **游标的基本概念**: 游标(Cursor)是一种机制,它允许我们遍历和操作由SQL查询返回的结果集。通过游标,我们可以控制数据的读取顺序,一次只处理一行,或者在...

    Oracle存储过程、游标、函数的详解

    ### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    Oracle 存储过程调用 CallabledStatement 实用例子(IN OUT 传游标) 一、Oracle 存储过程简介 Oracle 存储过程是一种可以在 Oracle 数据库中存储和执行的程序单元。存储过程可以由多种语言编写,例如 PL/SQL、...

    oracle存储过程游标

    ### Oracle 存储过程与游标使用详解 在Oracle数据库管理中,存储过程与游标是两个非常重要的概念。它们可以提高数据处理的效率、增强应用程序的灵活性,并且能够简化复杂的数据库操作。本文将根据提供的内容,深入...

    Oracle数据库游标使用.rar

    Oracle数据库游标是数据库编程中的一个重要概念,尤其在处理大量数据时,它们提供了一种有效且灵活的方法。游标允许程序逐行访问查询结果集,而不是一次性加载所有数据。这在处理复杂的数据操作,如循环处理、条件...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    oracle数据库 游标、存储过程和触发器.ppt

    Oracle 数据库游标、存储过程和触发器 Oracle 数据库是一种关系型数据库管理系统,它提供了多种机制来提高数据库的性能和安全性。在本文中,我们将讨论 Oracle 数据库中的三个重要概念:游标、存储过程和触发器。 ...

    JAVA调用ORACLE存储过程游标使用

    在Java编程中,调用Oracle数据库的存储过程并处理返回的游标是一项常见的任务。Oracle存储过程可以封装复杂的业务逻辑,而游标则用于在结果集上进行迭代,特别是当结果集太大,不适合一次性加载到内存时。下面将详细...

    存储过程 游标 oracle

    存储过程 游标 oracle 存储过程 游标 oracle 存储过程 游标 oracle 存储过程 游标 oracle

    ORACLE 游标使用示例

    在"游标.txt"文件中,可能包含了更多关于Oracle游标的使用实例和技巧,包括游标的声明、动态游标、游标变量、游标表达式以及游标在存储过程和函数中的应用。这些内容可以帮助你更深入地理解和掌握Oracle游标,提高你...

    oracle数据库的游标

    游标是Oracle数据库中一个重要的概念,它是一种在内存中用于存储SQL查询结果的临时工作区域。使用游标可以方便地访问查询结果集中的每一行,这对于处理大量数据是非常有用的。游标主要分为两种类型:显式游标和隐式...

    oracle存储过程使用游标对多表操作例子

    标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,如何利用存储过程和游标实现跨多个表的数据处理。描述部分重复了标题内容,强调了示例性质,表明文章将通过具体实例来...

    oracle 的函数、存储过程、游标、简单实例

    本主题将深入探讨Oracle中的几个核心概念:函数、存储过程、游标以及简单的实例,这些都是数据库管理员和开发人员日常工作中不可或缺的部分。 首先,我们来了解**Oracle函数**。函数是预定义的代码块,接受零个或多...

    Oracle存储过程out游标

    在`CURSOR_TEST2.txt`中,我们可能看到一个或多个带有“Out”游标的存储过程的定义。Out游标允许存储过程将查询的结果集作为输出参数返回。在PL/SQL中,声明一个Out类型的游标变量,然后在存储过程中打开这个游标...

    非常详细的Oracle游标整理

    Oracle游标是数据库编程中非常重要的一个概念,主要用于处理SQL查询的结果集。游标允许我们按需逐行处理数据,而不是一次性加载所有结果。这里详细介绍了Oracle中的三种游标类型:隐式游标、显式游标和REF游标。 1....

    oracle 游标,存储过程,SQL优化的总结

    Oracle数据库作为广泛应用的关系型数据库管理系统,其游标、存储过程和SQL优化是提升系统性能的关键技术。本文将深入探讨这些概念及其在实际工作中的应用。 首先,游标是数据库操作中一种处理数据集的方式,允许...

Global site tag (gtag.js) - Google Analytics