先对上一篇调用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的存储过程的调用了。

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

  1. oracle itl解析,oracle数据块dump文件中ITL详解

    oracle数据块dump文件中ITL详解 dump出Oracle block后,可以看到事物槽,包含有事物槽号(ITL),XID,UBA,FLAG,LCK,SCN. 本文主要讨论FLAG标记的规则, ...

  2. Oracle数据块损坏的恢复实例

    测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...

  3. Oracle的逻辑结构(表空间、段、区间、块)——Oracle数据块(一)

    Oracle 的逻辑结构 ( 表空间.段.区间.块 ) --块 Oracle 存储数据的最小单位是数据块.Oracle 管理 数据库 数据文件的存储空间被称为数据块,一个数据块是数据库使用的最小数据单 ...

  4. Oracle数据块原理深入剖析

    数据块(Oracle Data Blocks),本文简称为"块",是Oracle最小的存储单位,Oracle数据存放在"块"中.一个块占用一定的磁盘空间.特别注 ...

  5. oracle数据块坏,Oracle数据块损坏解决办法

    背景: 1.PDM(Windchill)系统 2.exp数据错误,没有rman备份数据 3.数据库trc文件报错 Dump file d:\oracle\admin\wind\udump\wind_o ...

  6. oracle数据块格式小结

    Oracle数据块可分为三层  更细化 Cache layer--20字节,包含DBA.块类型.块格式.SCN:数据块被读取时进行完整性检查,确保没有损坏或fracture,即块更新信息只有部分被写入 ...

  7. ORA-01578: ORACLE 数据块损坏 之奇妙处理 DBV

    下午接到研发人员报告: ORA-01578: ORACLE 数据块损坏 根据网上诸多仁兄的处理方案,具体采用下面检查: ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 20) O ...

  8. oracle数据块损坏后的修复方法

    关于oracle数据块损坏的解决方法,相关链接网址在: http://blog.csdn.net/dlinger/archive/2004/08/24/83911.aspx http://www.it ...

  9. Oracle 数据块损坏与恢复具体解释

    1.什么是块损坏: 所谓损坏的数据块,是指块没有採用可识别的 Oracle 格式,或者其内容在内部不一致. 通常情况下,损坏是由硬件故障或操作系统问题引起的.Oracle 数据库将损坏的块标识为&qu ...

最新文章

  1. HOJ 2678 Stars
  2. 前端—每天5道面试题(1)
  3. 划重点!2019年这类程序员非常稀缺,年薪超平均水平10倍
  4. html菜鸟ruby,ruby的基础语法
  5. 内存表与 InnoDB表对比
  6. 我为什么建议你发年终奖前跳槽?
  7. JAVA四行代码制作简单的翻译软件(傻瓜式教程)
  8. Jmeter下载安装详细步骤(2021)
  9. 2020软件测试报告模板
  10. matlab仿真下载,MATLAB仿真 关于MATLAB建模仿真源程序 - 下载 - 搜珍网
  11. 大数据Hadoop之——数据同步工具DataX
  12. 论文解读:Structural Optimization Makes Graph Classification Simpler and Better
  13. 我的信念 -居里夫人
  14. 禅道linux客户端服务端,禅道11.0版本发布,主要集成禅道客户端
  15. 从认知动机理论看设计:如何读懂用户?
  16. 如何拼局域网所有ip_在windows命令行批量ping局域网内IP
  17. IDA反汇编工具使用详解
  18. mac word 2016中文输入问题解决
  19. php用代码写的三行情书,三行情书经典语录_最美的三行情书(两行泪,一段情)
  20. 单片机中存储器扩展位地址线怎么算_单片机片外数据存储器扩展设计技巧简介...

热门文章

  1. 论文浅尝 - IJCAI | Knowledge is NOT always you need: 外部知识注入预训练模型的利与弊...
  2. 李涓子 | 机器智能加速器:大数据环境下知识工程的机遇和挑战
  3. 记录对String.format(Formatter().format())方法的总结
  4. DeepMind最新研究:如何将「大语言模型」 训练到最优?
  5. HTML5崛起之时,Java桌面时代就已经终结了
  6. c# 常用数据库封装
  7. HDU 4431 Mahjong(模拟题)
  8. C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用
  9. 对css类名className的一些操作的函数
  10. 【原】StreamInsight 浅入浅出(四)—— 例子