在实际的项目开发中我们需要通过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