免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-05 19:44 |只看该作者 |倒序浏览
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:35 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-06 09:04 |只看该作者
哪位大哥作过此类读取存储过程返回值的经验阿,小弟求救

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2009-02-14 10:35 |只看该作者
原帖由 mgqw 于 2009-2-6 09:04 发表
哪位大哥作过此类读取存储过程返回值的经验阿,小弟求救

一看就是做数据库包装的,我也做这个。用了一个sqlora的工具,包了一下OCI。
当初也遇到这个问题,我那时有语法问题(bind占位符放引号里了),操作时机和次序,bind长度(strlen(s)+1)等问题。
你这个我没看出来。

好象bindbypos需要占位符写:  :1,:2,:3,而不能写:in,:ta,:tb,应该用bindbyname,definebyname.

[ 本帖最后由 yulihua49 于 2009-2-14 10:46 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP