VC调用存储过程的通用方法(ORACLE篇)
2010-11-22 21:56
483 查看
From: http://soft.zdnet.com.cn/software_zone/2008/0922/1144116.shtml
先对上一篇调用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的存储过程的调用了。
先对上一篇调用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的存储过程的调用了。
相关文章推荐
- VC调用存储过程的通用方法(ORACLE篇)
- VC调用存储过程的通用方法(ORACLE篇)
- VC调用存储过程的通用方法(SQLServer篇)
- [转载]VC调用存储过程的通用方法(SQLServer篇)
- VC调用存储过程的通用方法(SQLServer篇)
- VC调用存储过程的通用方法(SQLServer篇)
- VC调用存储过程的通用方法(SQLServer篇)
- java+oracle的存储过程开发案例(包含了oracle存储过程的通用分页方法、java的工厂类)
- 通用的SQL和Oracle的存储过程执行方法
- ibatis调用oracle的函数,存储过程的方法_IN_和OUT_游标
- VC调用存储过程的方法
- ibatis调用oracle的函数,存储过程的方法_IN_和OUT_游标
- oracle常用函数以及调用入参为record的存储过程的方法,
- Oracle分页存储过程及java的具体调用方法
- LPAD在Oracle中和 mssql以及在MySQL中的不同用法 以及调用存储过程方法
- Oracle定时调用存储过程及取整的几个方法
- oracle :带有out参数的存储过程的调用方法
- ibatis调用oracle的函数、存储过程的方法 in和out游标
- VC调用存储过程的通用方法(ORACLE篇)
- j2ee调用Oracle带数组参数和游标的存储过程方法