文档章节

存储过程应用1

R-Lu
 R-Lu
发布于 2016/12/15 17:37
字数 574
阅读 16
收藏 0

之前做项目不会存储过程,时不时还被人鄙视,现在的工作上仍旧继续使用存储过程开发业务。

也不管启用存储过程和弃用存储过程的争执了,工作需要嘛。

 

create or replace procedure PROC_SH_DRAW_HIS(start_date in varchar2,
                                                        end_date   in varchar2,
                                                        resp_code  out varchar2,
                                                        msg        out varchar2) is
  v_share_count number(30) := 0;
  v_days                   number(30) := 0;
  v_n_day                  number(30) := 0;
  v_curr_day               varchar2(10);
  v_batch_step             varchar2(100);
  v_exchange_status        SH_DRAW_HIS.exchange_status%type := '0';
begin
  resp_code := '00';
  msg       := 'PROC_SH_DRAW_HIS end, successful completion!';

  select to_date(end_date, 'yyyymmdd') - to_date(start_date, 'yyyymmdd')
    into v_days
    from dual;

  --业务提供的截止日期必须大于或等于开始日期
  if v_days < 0 then
    resp_code := '98';
    msg       := 'the end_date must more than the start_date or same time!';
    return;
  end if;

  /*RED PACKETS SHARE HISTORY*/
  v_batch_step := 'OPEN SHARE HISTORY';

  while v_n_day <= v_days loop
    --算出当前是取那一天,时间在后面查询有用
    select to_char(to_date(start_date, 'yyyymmdd') + v_n_day, 'yyyymmdd')
      into v_curr_day
      from dual;
  
    --红包分享表的创建时间要建所引加快查询速度,索引格式to_char(create_time, 'yyyymmdd')
    for x in (select *
                from SHARE           t1,
                     WINNING_HISTORY t2
               where t1.packet_id = t2.packet_id
                 and to_char(t1.create_time, 'yyyymmdd') = v_curr_day) loop
    
      --PRIZE_UNIT=’01‘,取IS_EXCHANGE赋值
      if x.prize_unit = '01' then
        v_exchange_status := x.is_exchange;
      end if;
    
      --PRIZE_UNIT=‘02’:取STATUS赋值
      if x.prize_unit = '02' then
        v_exchange_status := x.status;
      end if;
    
      insert into SH_DRAW_HIS
        (pkey_id,
         main_packet_id,
         exchange_status,
         batch_history_status,
         batch_history_date)
      values
        (SEQ_TAB_SDH_ID.nextval,
         x.packet_id,
         v_exchange_status,
         '1',
         x.pdate);

      v_share_count := v_share_count + 1;
      --默认是每100笔提交一次
      if mod(v_share_count, 100) = 0 then
        commit work;
      end if;
    end loop;
    --提交剩余的记录,就是上次100笔提交之后,累计小于100的记录
    commit work;
    v_n_day := v_n_day + 1;
  end loop;
EXCEPTION
  WHEN OTHERS THEN
    resp_code := '99';
    msg       := 'BATCH_STEP : ' || v_batch_step || '||ORA : ' || sqlerrm || '!';
    rollback;
    return;
end PROC_SH_DRAW_HIS;

 

这个存储过程是把两张旧表的数据导入新表中。

这里面用到的小知识点:

1,参数字段类型和指定表字段类型一样,可以在对应字段类型未知情况下使用,另外就是设置默认值。

v_exchange_status       SH_DRAW_HIS.exchange_status%type := '0';

 

2,算出间隔时间,这个while循环要使用。

select to_date(end_date, 'yyyymmdd') - to_date(start_date, 'yyyymmdd')
    into v_days
    from dual;

 

3,while遍历循环获取需要计算的时间。

while v_n_day <= v_days loop

select to_char(to_date(start_date, 'yyyymmdd') + v_n_day, 'yyyymmdd')
      into v_curr_day
      from dual;

v_n_day := v_n_day + 1;

 end loop;

 

4,游标遍历数据,并且每100条提交一次。

for x in (select *
                from SHARE           t1,
                     WINNING_HISTORY t2
               where t1.packet_id = t2.packet_id
                 and to_char(t1.create_time, 'yyyymmdd') = v_curr_day) loop

v_share_count := v_share_count + 1;
      --默认是每100笔提交一次
      if mod(v_share_count, 100) = 0 then
        commit work;
      end if;

 end loop;

commit work;

© 著作权归作者所有

共有 人打赏支持
R-Lu

R-Lu

粉丝 13
博文 129
码字总数 41529
作品 0
浦东
程序员
私信 提问
dotConnect for Oracle入门指南(七):存储过程

【下载dotConnect for Oracle最新版本】 dotConnect for Oracle(原名OraDirect.NET)建立在ADO.NET技术上,为基于Oracle数据库的应用程序提供完整的解决方案。它为设计应用程序结构带来了新的...

电池盒
01/23
0
0
Oracle 存储过程 定义 和 优点 与 函数 区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是...

cnsytem
2013/07/10
0
0
数据库优化之创建存储过程、触发器

存储过程可加快查询的执行速度,提高访问数据的速度,帮助实现模块化编程,保存一致性,提高安全性。触发器是在对表进行插入、更新、删除操作时自动执行的存储过程,通常用于强制业务规则。 ...

杨书凡
2017/12/02
0
0
存储过程的优缺点

  前段时间,在维护公司的几年前的一个项目,虽说不上是历史悠久,但也有些年头了,采用三层架构,加上存储过程的这么一个老的架构,本来这个架构也没什么问题,大部分系统都是这么干的,但...

章为忠
2014/07/27
0
0
Java程序员的日常——存储过程知识普及

存储过程是保存可以接受或返回用户提供参数的SQL语句集合。在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装。可以在数据库中定义子程序,然后把子程序...

青夜之衫
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis&memcached&SQL&NoSQL

Why 一个应用肯定有两部分逻辑:数据逻辑和业务逻辑。 数据逻辑包括各种I/O,和内部的数据的处理,也就是在内部如何组织数据结构,变量也属于这一部分。 当一个应用变成一个进程,它负责数据逻...

backbye
今天
2
0
什么时候使用字节流、什么时候使用字符流,二者的区别

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 InputStream 和OutputStream,...

watermelon11
今天
6
0
Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
今天
5
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
今天
5
0
Django学习笔记-从创建虚拟环境到启用服务

1 前置条件 windows系统下,目前已经完成anaconda3或miniconda3的安装,这也意味着已经完成了python3的安装。 2 创建虚拟环境 1、通过Anaconda Prompt,使用conda命令创建虚拟环境(base) e...

davidwbnu
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部