请问如果在vc6环境下使用OCI接口执行存储过程?

jj1002 2003-10-19 10:25:07
问了那么长时间,难倒就没有一个中国人会吗?
...全文
66 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
netspirit 2004-01-09
  • 打赏
  • 举报
回复
假设调用存储过程 aaa(para1, para2),可以定义para1为输入参数,para2为输出参数。
下面参数*pst_link为数据库连接,假设已经建立好。

int CORAProcAAA(ST_LINK *pst_link, int nValue1, int *pnValue2)
{
int j;
int nRet=0;
OCIBind *bndp[2];

char *chInsStmt="BEGIN\
AAA(:nPara1, :nPara2);\
end;";

/* check input variable */

/* set bind input */
for (j=0; j<2; j++)
bndp[j] = (OCIBind *) 0;

/* define the application request, prepare */
pst_link->m_nErr=OCIStmtPrepare(...);
if (pst_link->m_nErr!=OCI_SUCCESS)
{
CORAGetLastError(pst_link, pst_error);
return -1;
}

/* bind the input variable */
pst_link->m_nErr=(
OCIBindByName(pst_link->m_stmthp, &bndp[0], pst_link->m_errhp,
(text *) ":nPara1", (sb4) -1, (dvoid *) &nValue1,
(ub4)sizeof(int) , SQLT_INT, (dvoid *) 0,
(ub2 *)0, (ub2 *)0, (ub4) 0, (ub4 *) 0,(ub4) OCI_DEFAULT) ||
OCIBindByName(pst_link->m_stmthp, &bndp[1], pst_link->m_errhp,
(text *) ":nPara2", (sb4) -1, (dvoid *) pnValue2,
(ub4)sizeof(int) , SQLT_INT, (dvoid *) 0,
(ub2 *)0, (ub2 *)0, (ub4) 0, (ub4 *) 0,(ub4) OCI_DEFAULT) );

if (pst_link->m_nErr!=OCI_SUCCESS)
{
CORAGetLastError(pst_link, pst_error);
return -1;
}

pst_link->m_nErr=OCIStmtExecute(...);
if (pst_link->m_nErr!=OCI_SUCCESS)
{
CORAGetLastError(pst_link, pst_error);
OCITransRollback (pst_link->m_svchp, pst_link->m_errhp, (ub4) OCI_DEFAULT);
return -1;
}

/* pst_link->m_nErr=OCITransCommit(...);
if (pst_link->m_nErr!=OCI_SUCCESS)
{
CORAGetLastError(pst_link, pst_error);
OCITransRollback (pst_link->m_svchp, pst_link->m_errhp, (ub4) OCI_DEFAULT);
return -1;
}
*/

return 0;

}/* end of function CORAProcAAA() */
submergerock 2004-01-09
  • 打赏
  • 举报
回复
楼上的兄弟,按照你的方法还是得不到存储过程的输出值,下面是我的测试存储过程
我在oci程序中要根据返回的值判度是否commit,rollback
procedure UPDATETESTBLOCK(P_RET1 IN OUT interger ,P_RET2 IN OUT integer)
is
begin
P_RET1=0;
P_RET2=1;
exception
when others then
begin
P_RET:=11;--表示执行失败
P_ERROR:='操作失败,请检查原因后再试!';
return;
end;

end UPDATETESTBLOCK;
submergerock 2004-01-08
  • 打赏
  • 举报
回复
我有做好的类,但不能得到存储过程的输出参数,郁闷
firmbank 2003-11-21
  • 打赏
  • 举报
回复
我的一个例子:
void taskCreate( )
{
Cda_Def cda;
text PLSQL[64];

strcpy((char *)PLSQL, "BEGIN my_pack.create_task('T'); END;");

if ( oopen(&cda, &lda, (text *) 0, -1, -1, (text *) 0, -1) )
{
err_report(&cda);
return;
}

if (oparse(&cda, PLSQL, (sb4) -1, FALSE, (ub4) VERSION_7))
{
err_report(&cda);
oclose(&cda);
return;
}

if ( oexec(&cda) )
{
err_report(&cda);
oclose(&cda);
return;
}
oclose(&cda);

return;
}
chanet 2003-11-21
  • 打赏
  • 举报
回复
VCKBASE 有几个例子.

http://www.vckbase.com/code/listcode.asp?mclsid=11&sclsid=1113
coobee 2003-10-19
  • 打赏
  • 举报
回复
用odbc呀,oci是由对应的驱动来调用的吧,不知道是不是这样?
jj1002 2003-10-19
  • 打赏
  • 举报
回复
等了好久好久,终于找到一个例程。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧