oci 调用存储过程ora-01009

stivenjia 2010-10-12 10:26:00
源码如下:

nRc = OCIEnvCreate((OCIEnv **) &p_env,OCI_DEFAULT,(dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0,
(size_t) 0, (dvoid **) 0);
nRc = OCIHandleAlloc( (dvoid *)p_env,(dvoid**)&p_err,OCI_HTYPE_ERROR,
(size_t)0,(dvoid**)0);
nRc = OCIHandleAlloc( (dvoid *)p_env,(dvoid **)&p_svc,OCI_HTYPE_SVCCTX,(size_t)0,
(dvoid **) 0);
nRc = OCIHandleAlloc( (dvoid*)p_env, (dvoid**)&p_svr, OCI_HTYPE_SERVER,(size_t)0,
(dvoid **) 0);
nRc = OCIHandleAlloc( p_env,(void**)&p_session, OCI_HTYPE_SESSION, 0, NULL);

nRc = OCIHandleAlloc((dvoid *) p_env,(dvoid **) &p_sql,OCI_HTYPE_STMT,(size_t)0,
(dvoid **) 0);
nRc = OCIServerAttach(p_svr,p_err,"TestOCI",strlen("TestOCI"),0);
// Specify server handle to service context
OCIAttrSet(p_svc,OCI_HTYPE_SVCCTX,p_svr,0,OCI_ATTR_SERVER,p_err);
// Associate username with session handle
OCIAttrSet(p_session,OCI_HTYPE_SESSION,"sz12366",strlen("sz12366"),OCI_ATTR_USERNAME,p_err);
// Associate password with session handle
OCIAttrSet(p_session,OCI_HTYPE_SESSION,"sz12366",strlen("sz12366"),OCI_ATTR_PASSWORD,p_err);
// Open session using service context and session handle
nRc = OCISessionBegin(p_svc,p_err,p_session,OCI_CRED_RDBMS,OCI_DEFAULT);
// Specify session handle to service context
OCIAttrSet(p_svc,OCI_HTYPE_SVCCTX,p_session,0,OCI_ATTR_SESSION,p_err);
if( nRc == OCI_ERROR)
{
OCIErrorGet((dvoid *)p_err,(ub4)1,(text*)NULL,&errcode,
(text*)errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
printf("Error - %.*s\n", 512, errbuf);
}
else
{
printf("Connect to orcl successful! 宸茶繛鎺ワ紒\n");
}
sprintf(szSqlStr,"%s","begin zsk_get_zlcode(:as_area_no,:as_typecode,:as_ctrl_id,:as_codename); end;");
nRc = OCIStmtPrepare(p_sql,p_err, (text*)szSqlStr, (ub4)strlen(szSqlStr),(ub4) OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT);
//灏嗗崰浣嶇鍜屽彉閲弍honename缁戝畾
nRc = OCIBindByPos(p_sql,&p_bnd[0],p_err,1,(dvoid *)chAreaNo,(sb4)(strlen(chAreaNo)+1),
SQLT_STR, NULL, NULL, NULL, 0, NULL, (ub4)OCI_DEFAULT);
nRc = OCIBindByPos(p_sql,&p_bnd[1],p_err,2,(dvoid *)chTypecode,(sb4)(strlen(chTypecode)+1),
SQLT_STR, NULL, NULL, NULL, 0, NULL, (ub4)OCI_DEFAULT);
nRc = OCIDefineByPos(p_sql,&p_dfn[0],p_err,3,(dvoid*)chCtrlid,(sb4)sizeof(chCtrlid),
SQLT_STR, NULL, NULL, NULL,(ub4)OCI_DEFAULT);
nRc = OCIDefineByPos(p_sql,&p_dfn[1],p_err,4,(dvoid*)chCodeName,(sb4)sizeof(chCodeName),
SQLT_STR, NULL, NULL, NULL,(ub4)OCI_DEFAULT);
//
nRc = OCIStmtExecute(p_svc,p_sql,p_err,(ub4)1,(ub4)0,(OCISnapshot *)NULL,
(OCISnapshot *)NULL,(ub4)OCI_DEFAULT);
if( nRc == OCI_ERROR)
{
OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, (text*)errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
printf("Error - %.*s\n", 512, errbuf);
}
OCITransCommit( p_svc, p_err, 0); //鐗瑰埆閲嶈锛岄渶瑕佺珛鍗虫彁浜わ紝鍚﹀垯鐪嬩笉鍒版墽琛屽瓨鍌ㄨ繃绋嬬殑鏁堟灉銆?
// Free select statement handle/* Disconnect */
nRc = OCIHandleFree((dvoid *) p_sql, OCI_HTYPE_STMT); /* Free handles */
nRc = OCIHandleFree((dvoid *) p_svr, OCI_HTYPE_SVCCTX);
nRc = OCIHandleFree((dvoid *) p_svc, OCI_HTYPE_SVCCTX);
nRc = OCIHandleFree((dvoid *) p_err, OCI_HTYPE_ERROR);


存储过程如下:
begin
-- Call the procedure
zsk_get_zlcode(as_area_no => :as_area_no,
as_typecode => :as_typecode,
as_ctrl_id => :as_ctrl_id,
as_codename => :as_codename);
end;
...全文
235 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
stivenjia 2010-10-13
  • 打赏
  • 举报
回复
请问一下输入参数是bind输出参数是define那么输入输出参数该怎么处理?
stivenjia 2010-10-12
  • 打赏
  • 举报
回复
现在用plsql测试这个存储过程是正确的但是输出的字符串包含中文,如果是这个问题导致的那么请问如何设置字符集?
minitoy 2010-10-12
  • 打赏
  • 举报
回复
奇怪,为什么我的文档里没有这个报错.
inthirties 2010-10-12
  • 打赏
  • 举报
回复
01009, 00000, "missing mandatory parameter"
// *Cause:
// *Action:

参数个数问题。有时字符集不正确也会有参数问题的错误出现。
stivenjia 2010-10-12
  • 打赏
  • 举报
回复
create or replace procedure ZSK_GET_ZLCODE(
as_area_no in varchar2,
as_typecode in varchar2,
as_ctrl_id out varchar2,
as_codename out varchar2
)
都是varchar类型,的四个参数
绑定一号输入
nRc = OCIBindByPos(p_sql,&p_bnd[0],p_err,1,(dvoid *)chAreaNo,(sb4)(strlen(chAreaNo)+1),
SQLT_STR, NULL, NULL, NULL, 0, NULL, (ub4)OCI_DEFAULT);
绑定二号输入
nRc = OCIBindByPos(p_sql,&p_bnd[1],p_err,2,(dvoid *)chTypecode,(sb4)(strlen(chTypecode)+1),
SQLT_STR, NULL, NULL, NULL, 0, NULL, (ub4)OCI_DEFAULT);
绑定三号输出
nRc = OCIDefineByPos(p_sql,&p_dfn[0],p_err,3,(dvoid*)chCtrlid,(sb4)sizeof(chCtrlid),
SQLT_STR, NULL, NULL, NULL,(ub4)OCI_DEFAULT);
绑定四号输出
nRc = OCIDefineByPos(p_sql,&p_dfn[1],p_err,4,(dvoid*)chCodeName,(sb4)sizeof(chCodeName),
SQLT_STR, NULL, NULL, NULL,(ub4)OCI_DEFAULT);
这么做应该没问题吧,目标oralce 版本是10g
心中的彩虹 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 stivenjia 的回复:]
源码如下:

C/C++ code

nRc = OCIEnvCreate((OCIEnv **) &p_env,OCI_DEFAULT,(dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid……
[/Quote]
仔细检查 是传入参数类型还是个数问题
stivenjia 2010-10-12
  • 打赏
  • 举报
回复
哪个存储过程就4个参数,都指定了,前两个是bind的后两个是define的
dawugui 2010-10-12
  • 打赏
  • 举报
回复
ORA-01009 missing mandatory parameter

Cause: A host language program call did not pass all required parameters.

Action: Check the syntax for the call and enter all required parameters.
stivenjia 2010-10-12
  • 打赏
  • 举报
回复
这个OCIDefineByPos有问题,现在将所有变量使用OCIBindByPos便可以正常执行但是这个存储过程是会输出执行结果的,请问这种现象该如何解决

17,082

社区成员

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

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