• 调用oracle程序包内的存储过程返回结果集


    在实际的项目开发中我们需要通过vb(或其他语言工具)调用oracle程序包内的存储过程返回结果集.这里以短信运营平台中的一个调用为例来说明这个过程,希望对你有所帮助.

    --一.使用sql*plus创建以下项目:
    --1.建表("ow_smp"为方案名称,下同)

    create table "ow_smp"."sm_send_sm_list"(
        serialno int primary key,   --序列号
        serviceid varchar(50),      --服务id(业务类型)
        smcontent varchar(1000),     --短信内容
        sendtarget varchar(20),      --发送目标   
        priority smallint,       --发送优先级
        rcompletetimebegin date,    --要求完成日期(开始)
        rcompletetimeend date,     --要求完成日期(结束)
        rcompletehourbegin smallint,    --要求完成时间(开始)
        rcompletehourend smallint,     --要求完成时间(结束)
        requesttime date,      --发送请求时间
        roadby smallint,       --发送通道(0:gsm模块,1:

    短信网关)
        sendtargetdesc varchar(100),    --发送目标描述
        feevalue float,        --本条短信信息费用(

    单位:分)
        pad1 varchar(50),
        pad2 varchar(100),
        pad3 varchar(200),
        pad4 varchar(500),
        pad5 varchar(1000)
    );
    --2.建立自增序列
    create sequence "ow_smp"."sendsno";
    create or replace trigger "ow_smp"."bfinert_sm_send" before
    insert on "sm_send_sm_list"
        for each row begin
    select sendsno.nextval into :new.serialno from dual;
    end;
    --3.插入数据
    insert sm_send_sm_list (smcontent) values(happy new year to jakcy!);
    insert sm_send_sm_list (smcontent) values(happy new year to wxl!);
    --4.建立程序包和包体

    create or replace package "ow_smp"."ow_smp_package"            
                is
          type tserialno is table of sm_send_sm_list.serialno%type
            index by binary_integer;
          type tserviceid is table of sm_send_sm_list.serviceid%type
            index by binary_integer;
          type tsmcontent is table of sm_send_sm_list.smcontent%type
            index by binary_integer;
          type tsendtarget is table of sm_send_sm_list.sendtarget%type
            index by binary_integer;
          type tpriority is table of sm_send_sm_list.priority%type
            index by binary_integer;
          type trcompletetimebegin is table of sm_send_sm_list.rcompletetimebegin%type
            index by binary_integer;
          type trcompletetimeend is table of sm_send_sm_list.rcompletetimeend%type
            index by binary_integer;         
          type trcompletehourbegin is table of sm_send_sm_list.rcompletehourbegin%type
            index by binary_integer;
          type trcompletehourend is table of sm_send_sm_list.rcompletehourend%type
            index by binary_integer;     
          type trequesttime is table of sm_send_sm_list.requesttime%type
            index by binary_integer;    
          type troadby is table of sm_send_sm_list.roadby%type
            index by binary_integer;   
          type tsendtargetdesc is table of sm_send_sm_list.sendtargetdesc%type
            index by binary_integer;
          type tfeevalue is table of sm_send_sm_list.feevalue%type
            index by binary_integer;
          type tpad1 is table of sm_send_sm_list.pad1%type
            index by binary_integer;      
          type tpad2 is table of sm_send_sm_list.pad2%type
            index by binary_integer;      
          type tpad3 is table of sm_send_sm_list.pad3%type
            index by binary_integer;      
          type tpad4 is table of sm_send_sm_list.pad4%type
            index by binary_integer;      
          type tpad5 is table of sm_send_sm_list.pad5%type
            index by binary_integer;
          type tcount is table of number
            index by binary_integer;

           procedure getsendsm
                  (v_nowbyminute   in number,
                   v_serialno      out tserialno,
                   v_serviceid     out tserviceid,
                   v_smcontent     out tsmcontent,
                   v_sendtarget     out tsendtarget,
                   v_priority      out tpriority,
                   v_rcompletetimebegin out trcompletetimebegin,
                   v_rcompletetimeend   out trcompletetimeend,
                   v_rcompletehourbegin out trcompletehourbegin,
                   v_rcompletehourend   out trcompletehourend,
                   v_requesttime        out trequesttime,
                   v_roadby             out troadby,
                   v_sendtargetdesc     out tsendtargetdesc,
                   v_feevalue           out tfeevalue,
                   v_pad1               out tpad1,
                   v_pad2               out tpad2,
                   v_pad3               out tpad3,
                   v_pad4               out tpad4,
                   v_pad5               out tpad5,
                   v_count            out tcount
                   );

    end;
    /
    create or replace package body "ow_smp"."ow_smp_package"       
                is
          procedure getsendsm --获得前1000条在指定时间内的待发短信
                  (v_nowbyminute   in number,
                   v_serialno      out tserialno,
                   v_serviceid     out tserviceid,
                   v_smcontent     out tsmcontent,
                   v_sendtarget     out tsendtarget,
                   v_priority      out tpriority,
                   v_rcompletetimebegin out trcompletetimebegin,
                   v_rcompletetimeend   out trcompletetimeend,
                   v_rcompletehourbegin out trcompletehourbegin,
                   v_rcompletehourend   out trcompletehourend,
                   v_requesttime        out trequesttime,
                   v_roadby             out troadby,
                   v_sendtargetdesc     out tsendtargetdesc,
                   v_feevalue           out tfeevalue,
                   v_pad1               out tpad1,
                   v_pad2               out tpad2,
                   v_pad3               out tpad3,
                   v_pad4               out tpad4,
                   v_pad5               out tpad5,
                   v_count            out tcount)
                   
          is
              cursor sendsm_cur is
                      select * from sm_send_sm_list
                      where rcompletehourbegin<=v_nowbyminute and

    rcompletehourend>=v_nowbyminute and (rcompletetimebegin is null or

    rcompletetimebegin<=sysdate)
                      and (rcompletetimeend is null or rcompletetimeend>=sysdate-1)
                      and rownum<1001;
                     
              smcount number default 1;
          begin
              for sm in sendsm_cur
              loop
                      v_serialno(smcount):=sm.serialno;
                      v_serviceid(smcount):=sm.serviceid;
                      v_smcontent(smcount):=sm.smcontent;
                      v_sendtarget(smcount):=sm.sendtarget;
                      v_priority(smcount):=sm.priority;
                      v_rcompletetimebegin(smcount):=sm.rcompletetimebegin;
                      v_rcompletetimeend(smcount):=sm.rcompletetimeend;
                      v_rcompletehourbegin(smcount):=sm.rcompletehourbegin;
                      v_rcompletehourend(smcount):=sm.rcompletehourend;
                      v_requesttime(smcount):=sm.requesttime;
                      v_roadby(smcount):=sm.roadby;
                      v_sendtargetdesc(smcount):=sm.sendtargetdesc;
                      v_feevalue(smcount):=sm.feevalue;
                      v_pad1(smcount):=sm.pad1;
                      v_pad2(smcount):=sm.pad2;
                      v_pad3(smcount):=sm.pad3;
                      v_pad4(smcount):=sm.pad4;
                      v_pad5(smcount):=sm.pad5;                 
                      if smcount=1 then
                        select count(*)
                        into v_count(smcount)
                        from sm_send_sm_list
                        where rcompletehourbegin<=v_nowbyminute and

    rcompletehourend>=v_nowbyminute and (rcompletetimebegin is null or

    rcompletetimebegin<=sysdate)
                        and (rcompletetimeend is null or rcompletetimeend>=sysdate-1)
                        and rownum<1001;
                      end if;
                      smcount:= smcount + 1;
              end loop;       
          end;
    end;
    /

    二.使用vb调用ow_smp_package.getsendsm存储过程:

    sub getsendsm()
    dim cmd as new adodb.command
    dim rs as new adodb.recordset
    cmd.activeconnection = getconnection获得数据库连接
    cmd.commandtext = "{call ow_smp_package.getsendsm(?,{resultset

    1000,v_serialno,v_serviceid,v_smcontent,v_sendtarget,v_priority,v_rcompletetimebegin,v_rcomp

    letetimeend,v_rcompletehourbegin,v_rcompletehourend,v_requesttime,v_roadby,v_sendtargetdesc,

    v_feevalue,v_pad1,v_pad2,v_pad3,v_pad4,v_pad5,v_count})}"
    cmd.commandtype = adcmdtext
    cmd.parameters.append .createparameter("v_nowbyminute", adinteger, adparaminput, , 900)
         
    rs.cursortype = adopenstatic
    rs.locktype = adlockreadonly
    set rs.source = cmd
    rs.open  
    while not rs.eof
          msgbox "sendsm data:serialno: " & rs("v_serialno") & ",smcontent: " & rs

    ("v_smcontent") & ",count: " & rs("v_count")
          对结果集的处理在这里增加代码
          rs.movenext
       wend
       rs.close  
       set rs=nothing
       set cmd=nothing
    end sub
  • 相关阅读:
    第十三周课程总结
    第十二周课程总结
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周课程总结&实验报告(四)
    第五周课程总结&试验报告(三)
    课程总结
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/1982041.html
Copyright © 2020-2023  润新知