免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3266 | 回复: 3
打印 上一主题 下一主题

OCI的输入数据绑定,输出数据定义问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-05 19:29 |只看该作者 |倒序浏览
PLSQL在sqlplus中执行如下(其中第一个是输入参数oci就是bind,第二,三个是输入参数oci就是define):
SQL> var a number;
SQL> var b number;
SQL> call keno.p2(22,:a,:b);

Call completed.

SQL> select :a,:b from dual;

        :A           :B
---------- ----------
        23           45

SQL>


我在程序中明明也将这三个变量绑定/定义了,可执行的时候就报错:ORA-01008: not all variables bound 郁闷的很,代码如下:
strncpy(query, "begin keno.p2(:in,:ta,:tb);end;", 256);(这个是sql语句字符串)
  1.         //依次绑定输入数据
  2.         for( i=1; i<=in_num; i++ )
  3.         {
  4.                 printf("bind i=%d\n\n\n",i );
  5.                 retcode=OCIBindByPos(conn->StmtHP, &pBind, conn->ErrHP, (ub4)i, (dvoid *)(indata+i-1),
  6.                                         strlen((char*)(indata+i-1))+1, SQLT_STR, NULL, NULL, NULL, 0, NULL, (ub4)OCI_DEFAULT);
  7.                 if(retcode!=OCI_SUCCESS)
  8.                 {               
  9.                         errNo = CheckErro( conn->ErrHP, errInfo );
  10.                         snprintf(logInfo, sizeof(logInfo), "[%s] in function DoPLSQL()", errInfo);
  11.                         InfoLog( func_id, logInfo );
  12. #ifdef _DEBUG               
  13.                         printf("error OCIBindByPos %d \n", i);
  14.                         fprintf(stderr, "ErroNo=%d\tErrInfo=%s\n",errNo , errInfo );
  15. #endif                                                
  16.                         return -1;               
  17.                 }                                       
  18.         }
  19.         
  20.         //依次定义输出数据
  21.         j = 1;
  22.         for( i=in_num+1; i<=in_num+out_num; i++ )
  23.         {
  24.                 printf("define i=%d\n",i );
  25.                 //初始化赋值,必须要先赋值才有输出
  26.                 memset( (outdata+i-1), 101, sizeof((outdata+i-1)) );
  27.                 retcode=OCIDefineByPos(conn->StmtHP, &pDefine, conn->ErrHP, (ub4)i, (dvoid *)(outdata+i-1),
  28.                                           strlen((char*)(outdata+i-1))+1, SQLT_STR , (dvoid *)0, (ub2 *)0,
  29.                                    (ub2 *)0, (ub4) OCI_DEFAULT);                                                              
  30.                 if(retcode!=OCI_SUCCESS)
  31.                 {
  32.                         errNo = CheckErro( conn->ErrHP, errInfo );
  33.                         snprintf(logInfo, sizeof(logInfo), "[%s] in function DoPLSQL()", errInfo);
  34.                         InfoLog( func_id, logInfo );
  35. #ifdef _DEBUG               
  36.                         printf("error OCIDefineByPos %d\n", i);
  37.                         fprintf(stderr, "ErroNo=%d\tErrInfo=%s\n",errNo , errInfo );
  38. #endif                                                
  39.                         return -1;               
  40.                 }        
  41.                 j++;                                                
  42.         }
  43.         
  44.         
  45.         //执行sql语句
  46.         retcode=OCIStmtExecute(conn->SvcHP, conn->StmtHP, conn->ErrHP, (ub4) 1, (ub4) 0,
  47.                           (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT );
  48.         if(retcode!=OCI_SUCCESS)
  49.         {
  50.                 errNo = CheckErro( conn->ErrHP, errInfo );
  51.                 snprintf(logInfo, sizeof(logInfo), "[%s] in function DoPLSQL()", errInfo);
  52.                 InfoLog( func_id, logInfo );
  53. #ifdef _DEBUG               
  54.                 printf("error OCIStmtExecute!!!!!!!!!! \n");
  55.                 fprintf(stderr, "ErroNo=%d\tErrInfo=%s\n",errNo , errInfo );
  56. #endif                                                
  57.                 return -1;               
  58.         }      
复制代码
编译后运行如下:
  1. bind i=1(这个是绑定输出)


  2. define i=2(这两个是定义输出)
  3. define i=3
  4. error OCIStmtExecute!!!!!!!!!!
  5. ErroNo=1008        ErrInfo=ORA-01008: not all variables bound
复制代码
明明只有一个输入变量,输出也现实我已经绑定了,为什么还是报这个错阿,
有这方面经验的打侠客帮忙看看,谢谢了先。

莫非在plsql中后面这两个也看作是输入,也必须要用bind而不是define???

[ 本帖最后由 mgqw 于 2009-2-5 20:34 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-05 19:55 |只看该作者
在线等待,我顶!

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
3 [报告]
发表于 2009-02-05 21:21 |只看该作者
OCIBindByPos 和 OCIDefineByPos 都是从头开始
此处错了:for( i=in_num+1; i<=in_num+out_num; i++ )
你改成:for (i=1; i<=out_num; i++ )

论坛徽章:
0
4 [报告]
发表于 2009-02-06 16:22 |只看该作者
原帖由 wjianc 于 2009-2-5 21:21 发表
OCIBindByPos 和 OCIDefineByPos 都是从头开始
此处错了:for( i=in_num+1; i


    问题找到了,类似这样的PLSQL形式,所有的参数不管是输入输出都要依次绑定/bind才行。
    仍然谢谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP