otl oracle存储过程,OTL调用Oracle存储过程

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

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

1、代码写的不规范。

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

2、调用格式

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

则过程调用采用:

begin

过程名(:参数1,:参数2,.....);

end;

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

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

则用常规的形式:

{call my_proc("

" :A, "

" :B, "

" :C "

")}"

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

// 创建存储过程

/*

Create Or Replace Procedure Test(P1 In Number, P2 In Number, P3 Out Number) Is

Begin

P3 := P1 + P2;

End Test;

*/

//调用代码

#include

using namespace std;

#include

#define OTL_ORA9I//OTL_ODBC // Compile OTL 4.0/ODBC

#include

#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,"

":b1, "

":c2 "

");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<

int a;

char b[31];

o>>a>>b;

cout<

}

void stored_proc2(void)

// invoking stored procedure

{

char* call_sql = "Begin test("

":1,"

":2,"

":3);end;"

otl_stream o(1,call_sql,db);

int a=1;

int b=3;

o<

int c;

o>>c;

cout<

}

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<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
以下是OTL库和Soci库链接Oracle数据库的简单示例,供您参考。 OTL库链接Oracle数据库的示例代码: ```c++ #include <iostream> #include <string> #include <vector> #include <otlv4.h> int main() { try { std::string db_user = "your_user_name"; std::string db_password = "your_password"; std::string db_name = "your_database_name"; std::string db_host = "your_host_name"; int db_port = 1521; otl_connect db; db.rlogon("user=" + db_user + "/password=" + db_password + "@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + db_host + ")(PORT=" + std::to_string(db_port) + ")))(CONNECT_DATA=(SERVICE_NAME=" + db_name + ")))"); otl_stream os; os.open(1, "SELECT * FROM your_table", db); std::vector<std::string> result; while (!os.eof()) { std::string value; os >> value; result.push_back(value); } os.close(); db.logoff(); for (auto& value : result) { std::cout << value << std::endl; } } catch (otl_exception& e) { std::cerr << e.msg << std::endl; } return 0; } ``` Soci库链接Oracle数据库的示例代码: ```c++ #include <iostream> #include <string> #include <vector> #include <soci/soci.h> #include <soci/oracle/soci-oracle.h> int main() { try { std::string db_user = "your_user_name"; std::string db_password = "your_password"; std::string db_name = "your_database_name"; std::string db_host = "your_host_name"; int db_port = 1521; std::string connect_str = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + db_host + ")(PORT=" + std::to_string(db_port) + ")))(CONNECT_DATA=(SERVICE_NAME=" + db_name + ")))"; soci::session db(soci::oracle, "service=" + connect_str, soci::username=db_user, soci::password=db_password); std::vector<std::string> result; soci::rowset<soci::row> rs = (db.prepare << "SELECT * FROM your_table"); for (auto it = rs.begin(); it != rs.end(); ++it) { soci::row const& row = *it; std::string value; row.get<std::string>(0, value); result.push_back(value); } for (auto& value : result) { std::cout << value << std::endl; } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } ``` 这两个库都有简单易用的API,选择哪一个更好需要根据个人需求和项目要求来决定。不过需要注意的是,OTL库对Oracle数据库的支持更加全面,具有更多的特性和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值