`

传递数组的存储过程实例

阅读更多
create or replace procedure PRE_BOOKTICKET_SEND(TICKETID VARCHAR2, PHONES tab_array,message varchar2)
 is
  --handel          utl_file.file_type;                    -- 定义处理文件对象
  v_phonenumber   varchar2(1024);                          -- 手机号码
  Type ticketModel Is Record                                           -- 书券记录
       (id                  con_ticketinfo.id%type,                    -- 书券ID
        price               con_ticketinfo.price%type,                 -- 书券单价
        consumetime         con_ticketinfo.consumetime%type,           -- 消费时长
        consumetype         con_ticketinfo.consumetype%type,           -- 书券类型 1:领取后定时消费 2:定日期消费
        consumebegin        con_ticketinfo.consumebegintime%type,      -- 书券消费开始日期
        consumeend          con_ticketinfo.consumeendtime%type);       -- 书券消费结束时间

  type us_ticketModel  is record                                       -- 用户书券总表记录
       (totalamount        us_ticketinfo.totalamount%type,
        earliestprice      us_ticketinfo.earliestprice%type,
        earliesttime       us_ticketinfo.earliesttime%type,
        useableamount      us_ticketinfo.useableamount%type,
        earlieststarttime  us_ticketinfo.earlieststarttime%type);

  v_ticket              ticketModel;
  --v_sendinto            con_ticket_sendinfo.sendmessage%type;         -- 书券消息内容
  v_usinfo              us_ticketModel;
  v_begindate           date;
  v_enddate             date;
  v_begindate_var       varchar2(20);                                      --  var类型开始发放时间/存放临时日期
  v_enddate_var         varchar2(20);                                      --  var类型解释发放时间/存放临时日期
  v_sql                 varchar2(1000);                                    --  执行SQL
  v_all_phone           number(20) := 0;                                   --  总发送数
  v_s_phone             number(20) := 0;                                   --  成功发送数
  v_f_phone             number(20) := 0;                                   --  失败发生数
  v_sdate               varchar2(20);
  v_edate               varchar2(20);
  dt_sysdate            date;                                              -- 系统时间
  dt_sysdate_var        varchar2(20);                                      -- 系统时间
  --v_tmp_date            varchar2(20);                                      --  临时日期变量


  --v_all_balance         us_ticketinfo.totalamount%type;
  --v_use_balance         us_ticketinfo.useableamount%type;
begin
  --dbms_output.put_line(to_char(sysdate,'yyyy-MM-dd HH24:mi:ss'));
  -- 1.查询书券的基本信息
  begin
      select t.id ,t.price ,t.consumetime ,t.consumetype ,t.consumebegintime , t.consumeendtime
        into v_ticket
        from con_ticketinfo t
       where t.id = TICKETID;
      --select h.sendmessage into v_sendinto from con_ticket_sendinfo h where h.id = TICKETID;
  end;

  -- 2.判读书券类型
  --if  v_ticket.consumetype = 1 then
  --    v_begindate := sysdate;
  --    v_enddate   := v_begindate + v_ticket.consumetime/24;
  --    v_sql := 'update con_ticketinfo set consumebegintime = sysdate , consumeendtime = sysdate + '||v_ticket.consumetime/24||' where id = '||TICKETID;
      --execute immediate v_sql;
  --    commit;
  --else
      v_begindate :=  v_ticket.consumebegin;
      v_enddate   :=  v_ticket.consumeend;
  --end if;
  if v_begindate is not null and v_enddate is not null then
     v_begindate_var := to_char(v_begindate,'yyyy-MM-dd HH24:mi:ss');
     v_enddate_var   := to_char(v_enddate,'yyyy-MM-dd HH24:mi:ss');
  end if;

  -- 3.循环查询书券
  -- handel := utl_file.fopen(FILE_DIR,FILE_NAME,'r');
  --loop
  for i in 1 .. PHONES.count loop
       begin
         -- 读取文件
         --utl_file.get_line(handel,v_phonenumber);
         v_phonenumber :=  PHONES(i);                   -- 手机号码
         v_phonenumber := substr(v_phonenumber,1,11);
         v_all_phone := v_all_phone+1;                  -- 总数+1

         -- 若是定时长的话,领取时间就是消费开始时间,
         -- 若是消费时间短的话,就是系统时间
         dt_sysdate := sysdate;
         if  v_ticket.consumetype = 1 then
             v_begindate := dt_sysdate;
             v_enddate   := v_begindate + v_ticket.consumetime/24;
             v_begindate_var := to_char(v_begindate,'yyyy-MM-dd HH24:mi:ss');
             v_enddate_var   := to_char(v_enddate,'yyyy-MM-dd HH24:mi:ss');
         end if;

         dt_sysdate_var := to_char(dt_sysdate,'yyyy-MM-dd HH24:mi:ss');

         -- 插入详表信息
         v_sql := 'insert into us_ticketinfo_detail
                values('||v_phonenumber||',
                       '||TICKETID||',
                       to_date('''||dt_sysdate_var||''',''yyyy-MM-dd HH24:mi:ss''),
                       to_date('''||v_begindate_var||''',''yyyy-MM-dd HH24:mi:ss''),
                       to_date('''||v_enddate_var||''',''yyyy-MM-dd HH24:mi:ss''),
                       '||v_ticket.price||',
                       '||v_ticket.price||',
                       to_date(to_char(sysdate,''yyyy-MM-dd HH24:mi:ss''),''yyyy-MM-dd HH24:mi:ss''),
                       '||seq_us_ticketinfo_detail.nextval||')';

         execute immediate v_sql;

         begin
            -- 查看用户书券总表
            select totalamount,earliestprice,earliesttime,useableamount,earlieststarttime
            into v_usinfo
            from us_ticketinfo
            where msisdn = trim(v_phonenumber);

            --dbms_output.put_line();

            -- 总的余额
            v_usinfo.totalamount := v_ticket.price + v_usinfo.totalamount;
            if (v_begindate <= sysdate) then
               v_usinfo.useableamount := v_ticket.price + v_usinfo.useableamount;
            end if;

            -- 书券开始时间大于用户即将开始使用的消费券时间并且 书券开始时间大于当前时间
            if v_begindate < v_usinfo.earlieststarttime  and v_begindate > sysdate  then
               v_usinfo.earlieststarttime := v_begindate;
            end if;

            -- 如果书券结束时间小于即将过期时间
            if v_enddate < v_usinfo.earliesttime  and v_enddate > sysdate  and v_begindate <= sysdate then
               v_usinfo.earliesttime  := v_enddate;
               v_usinfo.earliestprice := v_ticket.price;

            -- 如果书券结束时间等于即将过期时间
            elsif v_enddate = v_usinfo.earliesttime then
               v_usinfo.earliestprice := v_ticket.price + v_usinfo.earliestprice;
            end if;

            --v_begindate_var := to_char(v_usinfo.earlieststarttime,'yyyy-MM-dd HH24:mi:ss');
            --v_enddate_var   := to_char(v_usinfo.earliesttime,'yyyy-MM-dd HH24:mi:ss');

            v_sdate         :=  to_char(v_usinfo.earlieststarttime,'yyyy-MM-dd HH24:mi:ss');
            v_edate         :=  to_char(v_usinfo.earliesttime,'yyyy-MM-dd HH24:mi:ss');

            -- 更新书券表
            v_sql := 'update us_ticketinfo
                  set totalamount       = '||v_usinfo.totalamount||',
                      earliestprice     = '||v_usinfo.earliestprice||',
                      earliesttime      = to_date('''||v_edate||''',''yyyy-MM-dd HH24:mi:ss''),
                      lastmodifytime    = to_date(to_char(sysdate,''yyyy-MM-dd HH24:mi:ss''),''yyyy-MM-dd HH24:mi:ss''),
                      useableamount     = '||v_usinfo.useableamount||',
                      earlieststarttime = to_date('''||v_sdate||''',''yyyy-MM-dd HH24:mi:ss'')
                  where MSISDN = '||v_phonenumber;
            dbms_output.put_line(v_sql);
            execute immediate v_sql;

         exception
                 -- 若是记录不存在
                 when no_data_found then
                    begin

                       -- 若是定时长
                      if  v_ticket.consumetype = 1 then
                          v_sdate := to_char(v_begindate,'yyyy-MM-dd HH24:mi:ss');
                          v_edate := to_char(v_enddate,'yyyy-MM-dd HH24:mi:ss');
                      else
                          -- 转化日期格式
                          v_sdate := to_char(v_ticket.consumebegin,'yyyy-MM-dd HH24:mi:ss');
                          v_edate   := to_char(v_ticket.consumeend,'yyyy-MM-dd HH24:mi:ss');
                      end if;

                      -- 消费开始时间小于等于当前时间
                      if v_begindate <= sysdate then
                        v_sql := 'insert into us_ticketinfo values('||v_phonenumber||','||v_ticket.price||','||v_ticket.price||',to_date('''||v_edate||''',''yyyy-MM-dd HH24:mi:ss''),to_date(to_char(sysdate,''yyyy-MM-dd HH24:mi:ss''),''yyyy-MM-dd HH24:mi:ss''),'||v_ticket.price||',to_date(''2999-12-31 00:00:00'',''yyyy-MM-dd HH24:mi:ss''))';
                      else
                        v_sql := 'insert into us_ticketinfo values('||v_phonenumber||','||v_ticket.price||',0,to_date(''2999-12-31 00:00:00'',''yyyy-MM-dd HH24:mi:ss''),to_date(to_char(sysdate,''yyyy-MM-dd HH24:mi:ss''),''yyyy-MM-dd HH24:mi:ss''),0,to_date('''||v_sdate||''',''yyyy-MM-dd HH24:mi:ss''))';
                      end if;
                      --dbms_output.put_line(v_sql);
                      execute immediate v_sql;

                    exception
                       when others then
                            rollback;
                    end;
                 when others then
                      rollback;
         end;


         -- 发送站内消息
         v_sql := 'insert into
			          us_internalinfo(msgid,recmsisdn,sendmsisdn,type,isread,sendtime,message,title)
			          values(S_SERVER_US_INTERNALINFO_SEQ.NEXTVAL,'||v_phonenumber||',12345678900,1,0,to_date(to_char(sysdate,''yyyy-MM-dd HH24:mi:ss''),''yyyy-MM-dd HH24:mi:ss''),'''||message||''',''获得书券'')';
         --dbms_output.put_line(v_sql);
         execute immediate v_sql;

       v_s_phone := v_s_phone+1;                   -- 成功发送数
       exception
                 when no_data_found then
                      exit;
                 when others then                  -- 若是执行数据失败,则回滚记录
                      v_f_phone := v_f_phone+1;    -- 失败发送数
                      rollback;
       end;

       -- 每一万条数据提交一次
       if v_all_phone = 1000 then
          v_all_phone := 0;
          commit;
       end if;

  end loop;
  commit;

  -- 关闭文件
  --utl_file.fclose(handel);

  --begin
    -- 4.更新推送信息表书券状态
    --update con_ticket_sendinfo set sendflag = 1 where id = TICKETID;
    -- 5.更新书券主表状态
    --update con_ticketinfo set status = 5 where id = TICKETID;
    --commit;
  --exception
  --    when others then
  --         rollback;
  --end;
  --dbms_output.put_line(to_char(sysdate,'yyyy-MM-dd HH24:mi:ss'));
end PRE_BOOKTICKET_SEND;


分享到:
评论

相关推荐

    c++数组实例(有代码)

    该函数使用了指针来传递数组,并使用一个临时数组来存储逆序后的元素。然后,程序使用一个循环来输出逆序后的元素。 在第二个实例中,程序使用 malloc 函数来动态分配数组的内存空间。该函数使用了指针来传递数组,...

    数组程序练习实例.rar

    因此,可以使用指针进行数组操作,如传递数组给函数。 7. **数组在算法中的应用**: 数组在各种算法中发挥着关键作用,如搜索算法(线性搜索、二分搜索)、排序算法(冒泡排序、选择排序、插入排序、快速排序、...

    VB 数组元素做实参实例

    如果需要改变原数组的值,可能需要传递数组的引用或使用ByRef参数。 四、扩展应用 1. **多维数组**:除了单一维度的数组,VB还支持多维数组,如二维数组,可以用来表示矩阵或其他二维结构的数据。 2. **数组参数**...

    python调用c++传递数组的实例

    总结来说,这个实例展示了如何使用Python的`ctypes`库调用C++函数,以及如何在C++和Python之间传递数组。这种技术对于集成C++库、提升性能和利用已有的C/C++代码库非常有用。但要注意,跨语言调用可能涉及到类型转换...

    C++二维数组编程实例.zip

    二维数组可以作为函数的参数进行传递,但需要注意的是,数组名实际上代表数组的首地址,因此传递数组时实参和形参类型应一致,如: ```cpp void printArray(int arr[3][4]) { // 打印数组代码 } int main() {...

    form表单传递数组数据、php脚本接收的实例

    本文将深入探讨如何使用HTML的form表单传递数组数据,并演示如何用PHP脚本来接收和处理这些数据。 在HTML表单中,我们可以通过为输入元素的name属性指定一个以方括号`[]`结尾的值来创建数组。例如: ```html [name...

    VB 数组名做实参实例

    数组名做实参是VB中一种传递数组到函数或过程的方法,这种技术可以帮助我们简化代码并提高代码的可读性和复用性。下面将详细解释这个概念,并提供实例进行说明。 1. **数组的概念** - 在VB中,数组由具有相同数据...

    php数组分解实例源码

    在这个例子中,我们在构造函数中直接解构了传递的数组,将键值对映射到类的属性。 五、函数参数解构 从PHP 5.6开始,函数参数也可以解构: ```php function printInfo(array ['name' =&gt; $name, 'age' =&gt; $age]) {...

    C++指针与指针数组的两个实例 可运行

    本篇将通过两个实例深入探讨指针与指针数组的应用。 首先,我们来看"指针.cpp"这个文件。在这个文件中,可能包含了一个简单的程序,演示了如何声明、初始化和使用指针。在C++中,我们可以声明一个指向特定类型变量...

    图书销售管理系统——贯穿实例之数组应用实验说明

    ### 图书销售管理系统——贯穿实例之数组应用实验说明 #### 实验内容概述 本实验旨在通过设计一个小型的图书销售管理系统来实现对图书信息的基本管理功能。这些功能主要包括:添加图书、显示图书信息、查找图书、...

    单片机C语言实例9-用数组作函数参数控制流水花样.zip

    当我们将数组作为函数参数时,实际上是在传递数组的引用,而非复制整个数组。这使得函数内部可以修改数组的内容,并直接影响到函数外部的变量状态。 控制流水灯通常涉及到循环和条件判断。在函数内部,可以通过遍历...

    mysql存数组的实例代码和方法

    在MySQL中,由于存储过程不直接支持数组作为参数,我们需要采用一些变通的方式来处理数组问题。本示例将介绍如何通过字符串和临时表模拟数组功能,以满足在存储过程中的需求。 首先,创建一个名为`huafeng_db`的...

    passing-l-array-to-a-function.rar_多维传递函数_数组、函数

    在C++中,数组名本质上是指向其首元素的指针,因此传递数组名实际上是传递了对数组的引用。 3. **多维数组作为函数参数** - 当我们将多维数组作为参数传递给函数时,需要指定数组的维度信息。例如,在C++中,可以...

    C语言关于数组实例饿饿不

    在本实例中,我们将深入探讨“C语言关于数组”的应用和理解,这将有助于提升你的编程技能。以下是对C语言数组的详细讲解: 1. **数组定义与声明** C语言中的数组可以被定义为具有固定大小的同类型元素集合。数组的...

    C#中数组做参数的小例子

    数组作为函数参数时,有两种主要方式:传递数组的引用和传递数组的副本。C#中的方法参数默认传递的是值类型(如int)的副本,但对引用类型(如数组)则是传递引用。这意味着当数组作为参数传递时,实际上是传入了...

    PostgreSQL中使用数组改进性能实例代码

    - 如果需要在Mybatis中调用PostgreSQL的存储过程并传递数组参数,可以参考相关文章来了解实现方法。 - PHP读取PostgreSQL数组的示例可以帮助开发者更好地在PHP应用中操作PostgreSQL数组字段。 - 关于PostgreSQL的...

    C语言中指针、数组和函数的综合应用与实例解析.pdf

    C语言中指针、数组和函数的综合应用与实例解析 本文对C语言中指针、数组和函数的概念、运算和应用进行了详细的探讨和分析。指针是C语言的重要特色,是一种特殊的数据类型,通过存储空间的地址或编号来访问数据。...

    Java调用存储过程--传入集合参数

    在Java应用中,调用数据库存储过程时,往往需要处理复杂的参数传递,特别是当参数为集合类型时,这一过程变得更加具有挑战性。本文将深入探讨如何在Java中有效地调用存储过程,并向其传递集合参数,主要聚焦于Oracle...

    单片机C语言实例--301-用指针数组作为函数的参数显示多个字符串.zip

    本实例"301-用指针数组作为函数的参数显示多个字符串"旨在教授如何利用指针数组在单片机环境中传递和处理字符串。在深入探讨这个实例之前,我们先来理解几个关键概念。 **指针**: 在C语言中,指针是变量的地址,...

    数组与指针的艺术.doc

    数组与指针紧密相连,数组名通常表示数组的起始地址,因此可以用于传递数组的位置信息。然而,数组名不是一个可以赋值或修改的变量,而是一个常量表达式。这一特性使得数组名在某些场合下可以与指针等价使用,但两者...

Global site tag (gtag.js) - Google Analytics