源码如下: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;

解决方案 »

  1.   

    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
      

  2.   

    01009, 00000, "missing mandatory parameter"
    // *Cause:
    // *Action:参数个数问题。有时字符集不正确也会有参数问题的错误出现。
      

  3.   

    现在用plsql测试这个存储过程是正确的但是输出的字符串包含中文,如果是这个问题导致的那么请问如何设置字符集?
      

  4.   

    这个OCIDefineByPos有问题,现在将所有变量使用OCIBindByPos便可以正常执行但是这个存储过程是会输出执行结果的,请问这种现象该如何解决
      

  5.   

    ORA-01009 missing mandatory parameterCause: A host language program call did not pass all required parameters.Action: Check the syntax for the call and enter all required parameters.
      

  6.   

    哪个存储过程就4个参数,都指定了,前两个是bind的后两个是define的
      

  7.   

    请问一下输入参数是bind输出参数是define那么输入输出参数该怎么处理?