OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库。 OTL 使用起来比较方便,其官方网站也提供了详细的文档和例子( http://otl.sourceforge.net/otl3.htmhttp://otl.sourceforge.net/otl3_examples.htm )。

最近在项目中需要使用 OTL 调用 Oracle 存储过程,并且需要返回游标,在网上查了一下,相关的中文资料比较少,经过一番辛苦的查找和摸索,最后终于如愿达到目的。在这里把相关的经验分享给大家,如有不对的地方,欢迎拍砖。

OTL 调用 Oracle 存储过程,其官方文档中给出了相应的例子,地址是 http://otl.sourceforge.net/otl4_ex149.htm 。现节选关键部分如下:

otl_stream i(1,

"begin "

" my_pkg.my_proc(:f1,:f2, "

"         :str1, "

"         :cur1, "

"         :cur2); "

"end;",

db // connect object

);

i.set_commit(0); // set stream "auto-commit" to OFF.

char str1[101];

float f1;

char f2[31];

otl_refcur_stream s1, s2; // reference cursor streams for reading rows.

i<<8<<4;

i>>str1;

i>>s1;

i>>s2;

cout<

cout< Reading :cur1..."<

while(!s1.eof()){ // while not end-of-data

s1>>f1>>f2;

cout<

}

cout< Reading :cur2..."<

while(!s2.eof()){ // while not end-of-data

s2>>f1>>f2;

cout<

}

s1.close(); // closing the reference cursor

s2.close(); // closing the reference cursor

可以看出,调用存储过程和执行普通的 sql 大同小异,也是通过 otl_stream 对象绑定相关参数,不同之处有以下几点:

1 .调用存储过程 / 函数时,缓冲大小必须设置为 1 。

2 . Sql 声明时语句必须采用 ”begin …… end;” 的形式。存储过程如果位于包内,还必须带上包名。绑定参数除了声明类型、大小以外,还必须指明参数的输入输出标志。返回游标的大小代表了游标内的记录数。

3 .返回游标绑定的数据类型是 otl_refcur_stream ,就像普通的 otl_stream 一样,可以使用 while 循环读取其中的数据。游标对象使用完毕后,别忘了使用 close 方法将其关闭。

在这个过程中,有两个需要注意的地方:

1 . OTL 在输入输出参数的方向标志方面稍微有点不人性化,即要求所有的 in 、 out 与前面的逗号“ , ”之间不允许有空格、制表符等空白字符,否则就会无法识别方向标志而发生 ORA-01008 错误,并提示“并非所有变量都已绑定”。

2 .如果存储过程内存在多条执行路径,并且某些执行路径并不返回游标的情况下,就需要程序员自己判断在当前情况下是否需要接收游标。如果当前存储过程并未返回游标,而在 c++ 程序中执行了提取( >> )操作,就会发生 ORA-24338 错误 ,并提示“未执行语句句柄”。此时,如果允许的话可以通过存储过程返回的其他变量判断是否需要进行接收操作,如:

if(“00” == ret_code)      // 其中 ret_code 是存接收了储过程执行状态的变量

{

o >> first_cur;

o >> detail_cur;

}

OTL 调用存储函数和存储过程基本相似,只不过是多了一个返回值而以。格式大致如下:

otl_stream i(1,

"begin "

"   :rc :=my_pkg. my_func(:f1,:f2, "

"         :str1, "

"         :cur1, "

"         :cur2 "

"                          );  "

" end; ",

db // connect object

);

int res = 0;

char str1[101];

float f1;

char f2[31];

otl_refcur_stream s1, s2; // reference cursor streams for reading rows.

i<<8<<4;

i >> res;

i>>str1;

i>>s1;

i>>s2;

这里也有两个需要注意的地方,一是 sql 声明时存储函数名前面的等号要用“ := ”;再就是接收输出时,首先接收函数返回值,再依次接收其他输出。其他操作同存储过程一致。关于调用存储过程 / 函数时, sql 声明的具体格式, OTL 提供了一个专门的函数create_stored_proc_call ,可以生成相应的绑定 sql 。其具体使用方法参见 http://otl.sourceforge.net/otl4_ex153.htm 。

补充一下:笔者的环境是 otl v4.0.218 OraClient11g vs2008sp1 winxp sp3 。

原文:http://www.cnblogs.com/fnlingnzb-learner/p/6879003.html

otl oracle存储过程,OTL调用存储过程/函数及注意事项相关推荐

  1. oracle 定时任务 job 调用存储过程有回到输出参数(含out参数)

    oracle 定时任务 job 调用存储过程有返回输出参数(含out参数) 因前台调用一个含有OUT参数的存储过程,同时在JOB里也想调用同一个存储过程,不想将OUT参数去掉重新建一个存储过程再被JO ...

  2. oracle中调用过程,oracle中如何调用存储过程

    oracle中如何调用存储过程 发布时间:2020-03-08 03:28:03 来源:51CTO 阅读:511 作者:lxg290 一.通过pls块来调用存储过程: declare p_dzno v ...

  3. 第15章_存储过程与函数(创建存储过程、调用存储过程、存储函数的使用、存储过程和函数的查看、修改、删除)

    第15章_存储过程与函数 第15章_存储过程与函数 1. 存储过程概述 1.1 理解 1.2 分类 2. 创建存储过程 2.1 语法分析 2.2 代码举例 3. 调用存储过程 3.1 调用格式 3.2 ...

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

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

  5. 如何调用oracle的存储过程,oracle中如何调用存储过程

    一.通过pls块来调用存储过程: declare p_dzno varchar2(50); p_vchtype  VARCHAR2(50); p_productclass  VARCHAR2(50); ...

  6. Oracle 创建及调用存储过程,脚本示例

    方便复习 ===== drop table testTable; / commit; / --1.创建表 --============================================= ...

  7. oracle 存储过程中调用存储过程

    create procedure sp_name() begin --- end 比如: create procedure pro_showdbs() show datebase; end //用ex ...

  8. kettle调用oracle存储过程,kettle 调用存储过程

    这里整理一下有关kettle调用存储过程的问题 刚开机,就看到昨天写的存储过程在kettle的Job定时调用里没有执行成功,很是不理解!就是简单的更新两个表的字段,注意这里我定义了一个输出参数MESS ...

  9. 帆软报表调用mysql存储过程_FineReport调用存储过程

    "总结一下本人在项目中遇到的问题,如何在数据库表名未知且作为一种查询条件的情况下查询出数据集,仅能通过FineReport+Oracle实现. 首先分析这个问题的条件和要求: 条件:只有一个 ...

  10. SQL存储过程中调用存储过程返回的表

    存储过程pro_A返回一个表集合TableA,在存储过程pro_B中以TableA为数据源再做一重过滤,想实现代码复用,因此原意是在存储过程pro_B中调用存储过程pro_A,但事实发现我们不能写成s ...

最新文章

  1. 制备pdms膜的方法_专利:一种热致变色纳米纤维膜及其制备方法
  2. inet_ntoa()返回字符串的生命周期
  3. python 什么是先验概率?
  4. 利用ABAP调试模式修改SE16里数据库表的内容
  5. 没有工作怎么申请贷款?
  6. mvc 扫描jar jsp_SpringBoot+jsp项目启动出现404
  7. 更适合Pythoner的标记语言Yaml学习总结
  8. .sh文件是什么语言_关于Linux文件的一些基本命令和知识:
  9. Junit下获取src/test/resource路径
  10. 计算机基础17秋在线作业3,南开17秋学期《计算机应用基础》在线作业3
  11. Python debug——TypeError: unhashable type(list/set/dict)
  12. (4)Jquery1.8.3快速入门_基本选择器
  13. 几款实用Chrome插件
  14. MT【337】糖水不等式
  15. 微信小号赚钱(转载)
  16. 多线程编程与资源同步API和示例
  17. 二值化神经网络——BNN
  18. Photoshop从入门到放弃
  19. 英文歌曲:Action Songs for kids
  20. 计算机三级考点6:网络关键设备选型。

热门文章

  1. 百度再回应“泼水门”:强烈谴责 肇事者已被公安机关带走
  2. 36岁程序员:领导平时称兄道弟,裁员时立刻变脸,看透人性
  3. python+appium自动化测试-重复执行测试用例
  4. 使用FragmentTabHost出现的错误!
  5. leetcode-reverse words in a string
  6. Spring容器创建流程(3)对beanFactory设置
  7. ViewGroup 事件分发
  8. 初识openwrt(上)
  9. Ideal配置Struts项目提示Cannot resolve symbol 'xx.jsp',以及没有找到Namespace为/的指定Action的解决
  10. 【kafka】kafka 同时建立很多消费者 会怎么样