oracle数据块调用存储过程,VC调用存储过程的通用方法(ORACLE篇)

先对上一篇调用SQLServer的存储过程作一点补充,就是如果存储过程里有Insert,update,delete等操作,最后返回结果集,按示例代码有可能得不到数据,因为返回的数据有可能不在第一个结果集,需要进行遍历:

long lngRec = 0;

_RecordsetPtr Rs = m_Rs;   //m_Rs为调用存储过程返回的结果集

while(Rs)

{

//结果集的处理,有无数据的判断,数据处理等

while(!m_Rs->EndOfFile)

{

//...

}

Rs = Rs->NextRecordset((VARIANT *)lngRec);

}

调用Oracle的存储过程,vc的调用代码不需要变动,但需要对Oracle的存储过程和调用的SQL语句进行一些调整。

首先,连接字符串不能用ODBC,即连接字符串不能是

"Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;"

这种形式,而应该是类似:

"Provider=MSDAORA.1;Password=asdasd;User ID=Username;Data Source=world;Persist Security Info=True"

然后是存储过程的调整,Oracle存储过程怎么返回结果集网上的文章已经很多了,需要用到包,随便摘录一个:

CREATE OR REPLACE PACKAGE pkg_test

AS

TYPE myrctype IS REF CURSOR;

PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);

END pkg_test;

/

CREATE OR REPLACE PACKAGE BODY pkg_test

AS

PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)

IS

sqlstr   VARCHAR2 (500);

BEGIN

IF p_id = 0 THEN

OPEN p_rc FOR

SELECT ID, NAME, sex, address, postcode, birthday

FROM student;

ELSE

sqlstr :=

"select id,name,sex,address,postcode,birthday

from student where id=:w_id";

OPEN p_rc FOR sqlstr USING p_id;

END IF;

END get;

END pkg_test;

/

其实不用包也可以,直接创建get,只需要把最后一个参数p_rc的类型改为sys_refcursor就可以了。

最后是SQL语句的调整,SQLServer是直接get 0就可以,Oracle必须这样调用:

{call get(0)}

即执行:

m_Rs->Open("{call get(0)}",(IDispatch*)(m_Conn->m_Conn),adOpenStatic,    adLockReadOnly,adCmdText);

get虽然有两个参数,但是SQL语句里这个最后的输出参数是可以不用写的。

{call 存储过程名(输入参数1,输入参数2,...)}这样的SQL语句在SQLServer和Oracle是都能得到返回结果集的,因此只要把SQL语句改成这种形式,程序代码不需要修改,就可以同时支持SQLServer和Oracle的存储过程的调用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值