OTL很早前用过,今天写东西要调存储过程,程序写完了,调试死活通不过,折腾了一早晨。

最后才发现错误,这里总结一下:

1、代码写的不规范。

有个参数后边少写了个“,”以至于总是抱错。而单独写的测试例子就没问题,后来一步一步跟踪了后才发现。

2、调用格式

a、如果#define OTL_ORA9I // Compile OTL 4/OCI8编译

则过程调用采用:

begin

过程名(:参数1<类型,in|out|inout>,:参数2<类型,in|out|inout>,.....);

end;

的形式,和在pl/sql中一样。

b、如果用#define OTL_ODBC // Compile OTL 4.0/ODBC编译

则用常规的形式:

{call my_proc("
              " :A<int,inout>, "
              " :B<char[31],out>, "
              " :C<char[31],in> "
              ")}"

3、附文档中给出的测试代码

// 创建存储过程

/*

Create Or Replace Procedure Test(P1 In Number, P2 In Number, P3 Out Number) Is
Begin
P3 := P1 + P2;
End Test;

*/

//调用代码

#include <iostream>
using namespace std;

#include <stdio.h>
#define OTL_ORA9I//OTL_ODBC // Compile OTL 4.0/ODBC
#include <otlv4.h>

#pragma comment(lib,"oci.lib")

otl_connect db; // connect object

void stored_proc1(void)
// invoking stored procedure

otl_stream o(1, // buffer size should be equal to 1 in case of stored procedure call
"begin my_proc("
":a1<int,inout>,"
":b1<char[31],out>, "
":c2<char[31],in> "
");end;",
// stored procedure call
db // connect object
);

o.set_commit(0); // set stream auto-commit off since
// the stream does not generate transaction 
o<<1<<"Test String1" // assigning :1 = 1, :3 = "Test String1"

int a;
char b[31];

o>>a>>b;
cout<<"A="<<a<<", B="<<b<<endl;
}

void stored_proc2(void)
// invoking stored procedure

char* call_sql = "Begin test("
":1<int,in>,"
":2<int,in>,"
":3<int,out>);end;"
otl_stream o(1,call_sql,db);

int a=1;
int b=3;

o<<a<<b; // assigning :1 = 1, :3 = "Test String1"

int c;

o>>c;
cout<<"A="<<a<<", B="<<b<<", C="<<c<<endl;
}

int main()
{
otl_connect::otl_initialize(); // initialize environment
try{
//CString str_conn;

db.rlogon(user/pwd@server); //更换到对应值

otl_cursor::direct_exec
(
db,
"CREATE OR REPLACE PROCEDURE my_proc "
" (A IN OUT NUMBER, "
" B OUT VARCHAR2, "
" C IN VARCHAR2) "
"IS "
"BEGIN "
" A := A+1; "
" B := C; "
"END;"
); // 也可以直接用代码创建来测试用的过程

stored_proc1(); // invoking stored procedure
stored_proc2();
}
catch(otl_exception& p)

// intercept OTL exceptions
cerr<<p.msg<<endl; // print out error message
cerr<<p.code<<endl; // print out error code
cerr<<p.var_info<<endl; // print out the variable that caused the error
cerr<<p.sqlstate<<endl; // print out SQLSTATE message
cerr<<p.stm_text<<endl; // print out SQL that caused the error
}
db.logoff(); // disconnect from the data source
getchar();
return 0;
}

OTL调用Oracle存储过程相关推荐

  1. oracle otl,使用OTL调用Oracle的存储函数

    OTL介绍: OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,最新 版本4.0.104,参见,下载地址otl ...

  2. mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析

    mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析 参考文章: (1)mybatis 调用 oracle 存储过程 select in ...

  3. java调用存储过程 oracle_java调用oracle存储过程

    java调用oracle存储过程 java代码 Map param = new HashMap(); param.put("in_str", "1,2,3,4" ...

  4. C#调用Oracle存储过程分页

    直接调用Oracle中的存储过程完成对表的分页,对代码封闭程度高,执行高效.以下为C#分页类代码,包括Oracle数据库 端存储过程PLSQL代码. //    程序调用示例: // int tota ...

  5. spring+springMvc+mybatis 调用oracle 存储过程

    最近在项目中遇到在mybatis中调用oracle存储过程的问题,网上各种查询,最终解决了问题,在我们项目中我只需要oracle 的存储过程返回一个字符串用来存入数据库作为表数据的主键, 接下来整理代 ...

  6. 关于调用Oracle存储过程时发生“BCD Overflow”错误的处理

    笔者最近在使用TSQLStoredProc调用Oracle存储过程时发现,即使存储过程体为空时,都会发生 BCD Overflow 错误,该表部分定义如下: PLANE_ALL_PARAMETER表: ...

  7. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

    java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...

  8. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法.分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL. 首先,在数据库端 ...

  9. java c3p0 存储过程_JAVA Spring 连接池 调用 Oracle 存储过程的问题?

    求助,JAVA Spring 连接池 调用 Oracle 存储过程的问题?在Spring中配置了c3P0的连接池,在调用Oracle的存储过程时,报错[code]java.lang.ClassCast ...

最新文章

  1. jquery each函数的使用
  2. Python实训day05am【正则表达式、网络爬虫】
  3. Android 优化电池使用时间——根据需要操作广播接收器
  4. 路由器的异步和同步串行接口
  5. SAP CRM text determination调试
  6. 平衡树(模板 and 题目)记录
  7. 【caffe】ubuntu配置matlab接口----matcaffe
  8. 用户自定义控件(UserControl)用法大全
  9. 三菱plc pwm指令_三菱PLC初学者只要解决这50个问题,那你就觉得很容易上手?
  10. 如何查询目标计算机的ip地址,基于Wireshark获取目标ip地址
  11. 竖屏java转横屏_Android屏幕旋转之横屏竖屏切换的实现
  12. 转载:程序员必备的8个学习工具
  13. 亚马逊森林大火----- 我也来评论一下
  14. 《SteamVR2.0/Input》(Yanlz+SteamVR+Input+OpenVR+Runtime+SteamVR_Action+立钻哥哥+==)
  15. 奈奎斯特定理与香农定理
  16. 最详细新版网课联盟27刷网课平台源码+安装教程+最新模板+下载地址
  17. Linux 使用 sed 整行(列)刪除
  18. Pycharm配置编译器
  19. 猿辅导的python课_猿辅导和一课哪个更好?
  20. 航模继电器技术改进点,记录

热门文章

  1. 虚拟机系统的磁盘扩容妙招及案例
  2. BS-XX-007基于JSP实现户籍管理系统
  3. 使用卷积神经网络进行文本分类textCNN
  4. SQL-sp_executesql
  5. HTML的BODY内标签介绍
  6. APPIUM Android 定位方式
  7. opencv基础知识-videowriter
  8. HDU 1544 Palindromes(回文子串)
  9. 自定义Dialog(一)
  10. 45个纯 CSS 实现的精美边框效果【附演示和源码】【上篇】