OTL调用Oracle存储过程-阿里云开发者社区

开发者社区> xumaojun> 正文

OTL调用Oracle存储过程

简介: OTL很早前用过,今天写东西要调存储过程,程序写完了,调试死活通不过,折腾了一早晨。 最后才发现错误,这里总结一下: 1、代码写的不规范。 有个参数后边少写了个“,”以至于总是抱错。而单独写的测试例子就没问题,后来一步一步跟踪了后才发现。
+关注继续查看

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;
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
30 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)
30 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
29 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(2)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(2)
31 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(7)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(7)
25 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(9)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(9)
38 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(8)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(8)
32 0
查询MySQL字段注释的 5 种方法!(2)
查询MySQL字段注释的 5 种方法!(2)
31 0
查询MySQL字段注释的 5 种方法!(5)
查询MySQL字段注释的 5 种方法!(5)
29 0
查询MySQL字段注释的 5 种方法!(3)
查询MySQL字段注释的 5 种方法!(3)
27 0
+关注
xumaojun
乐于学习与分析
1079
文章
95
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载