C++ 如何使用table类型的参数调用存储过程
我想调用一个存储过程,它有一个参数,类型为C++ 如何使用table类型的参数调用存储过程,c++,oracle,oracle11g,occi,C++,Oracle,Oracle11g,Occi,我想调用一个存储过程,它有一个参数,类型为表 如何在Windows C++应用程序中使用 OCCI(11G1)?< /P> 以下是存储过程的定义: FUNCTION am_send( p_caFnr IN VARCHAR2, p_TabBgr IN DSKS_BGR_TAB, p_caTextout OUT VARCHAR2) RET
表
如何在Windows C++应用程序中使用<代码> OCCI<代码>(11G1)?< /P> 以下是存储过程的定义:
FUNCTION am_send(
p_caFnr IN VARCHAR2,
p_TabBgr IN DSKS_BGR_TAB,
p_caTextout OUT VARCHAR2)
RETURN NUMBER;
以及使用的类型:
create or replace
TYPE DSKS_BGR_TAB,
AS TABLE OF DSKS_BGR
create or replace
TYPE DSKS_BGR
(BgrNr VARCHAR2(3),
TrId VARCHAR2(8))
到目前为止我所做的: 我使用OTT实用程序创建了类型为
DSKS\u BGR
的对象表示
到目前为止,我的代码是:
Environment* env = Environment::createEnvironment(Environment::OBJECT);
try
{
Connection *con = env->createConnection("xxxxx", "xxxxx", "xxxxx");
Statement* statement = con->createStatement("BEGIN :1 := am_send(:2, :3, :4); END;");
statement->registerOutParam(1, OCCINUMBER);
statement->setString(2, "Test");
// ?? DSKS_BGR_TAB
statement->registerOutParam(4, OCCISTRING, 1000);
statement->execute();
int result = statement->getNumber(1);
string textOut = statement->getString(4);
env->terminateConnection(con);
}
catch(const SQLException &exc)
{
cout << exc.getErrorCode() << exc.getMessage();
}
Environment::terminateEnvironment(env);
Environment*env=Environment::createEnvironment(Environment::OBJECT);
尝试
{
连接*con=env->createConnection(“xxxxx”、“xxxxx”、“xxxxx”);
语句*Statement=con->createStatement(“开始:1:=am_发送(:2,:3,:4);结束;”;
语句->registerOutParam(1,编号);
语句->设置字符串(2,“测试”);
//?DSKS_BGR_选项卡
语句->寄存器输出参数(4,字符串,1000);
语句->执行();
int result=statement->getNumber(1);
string textOut=语句->获取字符串(4);
环境->终端连接(con);
}
捕获(常量SQLException和exc)
{
你就快到了
使用对象类型转换器实用程序创建oracle类型的对象表示
创建指向OTT创建类型的指针的vector
,并对语句使用OCCI调用setVector()
执行
下面是一个小代码示例:
#include <occi.h>
#include <iostream>
#include "RegisterMappings.h"
using namespace oracle::occi;
using namespace std;
void callproc(Connection *con)
{
vector<my_obj_t *> vect;
int i;
for (i=0; i<10; i++)
{
my_obj_t *obj = new my_obj_t();
obj->setid(i);
obj->setname("TEST");
vect.push_back(obj);
}
cout << "\ncallproc - invoking a PL/SQL procedure with parameters" << endl;
Statement *stmt = con->createStatement("BEGIN my_proc(:1); END;");
cout << "\nExecuting the block :" << stmt->getSQL() << endl;
setVector(stmt, 1, vect, "MY_OBJ_TAB_T");
stmt->execute();
con->terminateStatement (stmt);
cout << "\nocciproc - done" << endl;
// delete allocated memory
for (i=0; i<10; i++)
{
delete vect[i];
}
}
// end of callproc ()
int main()
{
try {
Environment* env = Environment::createEnvironment(Environment::OBJECT);
RegisterMappings(env);
Connection* conn = env->createConnection("scott","tiger");
callproc(conn); conn->commit();
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
}
catch(SQLException &ex)
{
cout << ex.getMessage() << endl;
}
}
#包括
#包括
#包括“RegisterMappings.h”
使用名称空间oracle::occi;
使用名称空间std;
void callproc(连接*con)
{
向量向量;
int i;
for(i=0;isetid(i);
obj->setname(“测试”);
矢量推回(obj);
}
我想会有内存泄漏吗?你需要使用delete手动释放向量中每个项目的内存。我知道这是一个很好的例子,只是我最近浪费了这么多时间寻找内存泄漏,很抱歉让人讨厌:/@user1645975:你完全正确:上面的例子中有内存泄漏。我会修复这个问题(官方甲骨文)上面的示例代码。是的,我记得这些示例,几年前,我不知道内存泄漏和我的想法——“这里肯定不会有错误,这是一个官方示例…”