VB调用ORACLE存储过程返回多记录集

本文介绍如何使用VB调用Oracle存储过程并处理多记录集的返回结果,提供了两种不同的实现方法及其代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     一直没有写原创的习惯,每次都是从别的贴子拷贝过来。实在是不好意思。最近想把自己做的一个项目中所解决的问题和大家共享一下。希望对遇见这种情况的朋友有所帮助。
      程序中要用到VB调用ORACLE的存储过程,存储过程返回的是多记录集。要是在C#中这种情况很好解决。但是到了VB中。情况就不一样了。在优快云上也查了。都没有人说出完整的解决的解决方案。经过几天的摸索。终于搞定。下面是存储过程和相应的VB调用代码。
      存储过程如下:大家只需关心返回的记录集

ContractedBlock.gifExpandedBlockStart.gif存储过程
 1None.gifCREATE OR REPLACE PACKAGE BODY REPORT AS
 2None.gif  PROCEDURE  p_Report_Yysc_Zyq(strDate in date,v_result1 out t_cursor,v_result2 out t_cursor)
 3None.gif is
 4None.gif     nCount   int;
 5None.gif     d_date    date;
 6None.gif begin 
 7None.gif   
 8None.gif  open v_result1 for SELECT SSDW,sum(nvl(ZJS,0)) ZJS,sum(nvl(KJS,0)) KJS,sum(nvl(RCY,0)) RCY,sum(nvl(RC_Y,0)) RC_Y,sum(nvl(YLBH,0)) YLBH,sum(nvl(Y_LBH,0)) Y_LBH,sum(nvl(YCYL,0)) YCYL,sum(nvl(NCYL,0)) NCYL,round((1- (sum(nvl(RC_Y,0))/0.823/sum(nvl(RCY,0)))),3)*100 HS  FROM   REPORT_YYSC_ZYQ where TRUNC(rq)=TRUNC(d_date) and HZLX='1' group by SSDW;
 9None.gif  open v_result2 for select * from REPORT_YYSC_ZYQ where trunc(RQ)=trunc(strDate) and HZLX='1';
10None.gif end p_Report_Yysc_Zyq;  
          VB调用的代码如下:用下面的两种方式都可以调用:
ContractedBlock.gifExpandedBlockStart.gifVB调用存储过程1
 2ExpandedBlockStart.gifContractedBlock.gifPublic Function ExecProcByODBC()Function ExecProcByODBC(ByVal ProcName As StringByVal sDate As DateAs Variant
 3InBlock.gifDim mycmd As ADODB.Command
 4InBlock.gifSet mycmd = New ADODB.Command
 5InBlock.gifDim rs As New ADODB.Recordset
 8InBlock.gifmycmd.CommandText = "{call " + ProcName + "(?,{resultset 1, v_result1,v_result2})}"
 9InBlock.gif 
10InBlock.gifSet param = mycmd.CreateParameter("sDate", adDate, adParamInput, 16, sDate)
11InBlock.gifmycmd.Parameters.Append param
14InBlock.gifmycmd.CommandType = adCmdText
15InBlock.gif
16InBlock.gifrs.CursorType = adOpenStatic
17InBlock.gifrs.LockType = adLockReadOnly
18InBlock.gif
19InBlock.gifSet mycmd.ActiveConnection = MyCnt
20InBlock.gifSet rs.Source = mycmd
21InBlock.gifrs.Open
22InBlock.gifSet ExecProcByODBC = rs
23InBlock.gifSet rs = Nothing
24InBlock.gifSet mycmd = Nothing
25ExpandedBlockEnd.gifEnd Function
ContractedBlock.gifExpandedBlockStart.gifVB调用存储过程2
 2ExpandedBlockStart.gifContractedBlock.gifPublic Function ExecProc()Function ExecProc(ByVal ProcName As StringByVal sDate As DateAs Variant
 3InBlock.gifDim mycmd As ADODB.Command
 4InBlock.gifSet mycmd = New ADODB.Command
 5InBlock.gifDim rs As New ADODB.Recordset
 6InBlock.gifDim rs1 As New ADODB.Recordset
 7InBlock.gifSet mycmd.ActiveConnection = MyCnt
 8InBlock.gifmycmd.CommandType = adCmdStoredProc
 9InBlock.gifmycmd.CommandText = ProcName
10InBlock.gifmycmd.Parameters.Append mycmd.CreateParameter("sDate", adDate, adParamInput, 16, sDate)
13InBlock.gifSet rs = mycmd.Execute
25InBlock.gifSet ExecProc = rs
26InBlock.gifSet rs = Nothing
27InBlock.gifSet mycmd = Nothing
28ExpandedBlockEnd.gifEnd Function
最后还要强调一点的时候,在写连接字符串的时候。务必如下。否则在用VB的NEXTRECORDSET会调用不成功。
strCnt = "Provider=OraOLEDB.Oracle.1;Password=1;Persist Security Info=True;User ID=1;Data Source=ORA92;PLSQLRSet=1"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值