我要通过OCI向oracle中插入数据。可我有一个表中有一列可以为空,此变量名为n17,绑定如下:OCIBindByName(stmthp, &bnd1p, errhp, (text *) ":n17",-1, (dvoid *) &n17, (sb4) sizeof(n17),SQLT_FLT, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0,(ub4) 0, (ub4 *) 0, OCI_DEFAULT)。
请问上述绑定有问题吗?另外,向此列插入null,具体应该怎么做?指示器变量应该怎么用啊?
初次接触OCI,望大家多多指教。

解决方案 »

  1.   

    指示器变量:
    由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为NULL或所读取的列值是否为NULL,以及所读取的列值是否被截取。  除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:  
    作为输入变量时:(如insert ,update语句中)  
        =-1:OCI程序将NULL赋给Oracle表的列,忽略占位符结合的程序变量值  
        >=0:应用程序将程序变量值赋给指定列  
    作为输出变量时:(如select语句中)  
        =-2:所读取的列数据长度大于程序变量的长度,则被截取。  
        =-1:所读取的值为NULL,输出变量的值不会被改变。  
        =0:数据被完整读入到指定的程序变量中  
        >0:所读取的列数据长度大于程序变量的长度,则被截取,指示符变量值为所读取数据被截取前的实际长度 
      

  2.   

    Oracle的OCI绑定函数中是如何引用NULL值的,建议多参考一下此地址的前前后后:http://www.hackhome.com/InfoView/Article_165465_16.html
      

  3.   

    上面的这些东西我也看了,可是看不太明白啊。有没有什么具体的解决方法啊?我是不是把
    OCIBindByName(stmthp, &bnd1p, errhp, (text *) ":n17",-1, (dvoid *) &n17, (sb4) sizeof(n17),SQLT_FLT, (dvoid *) 0, (ub2 *) 0, (ub2 *) 0,(ub4) 0, (ub4 *) 0, OCI_DEFAULT)
    改为
    OCIBindByName(stmthp, &bnd1p, errhp, (text *) ":n17",-1, (dvoid *) &n17, (sb4) sizeof(n17),SQLT_FLT, (dvoid *) -1, (ub2 *) 0, (ub2 *) 0,(ub4) 0, (ub4 *) 0, OCI_DEFAULT)
    就可以了?
      

  4.   

    没有做过OCI编程,但自已可以多试试啊!
    有时候编程的快乐在于经历数次失败后才获得的成功。
      

  5.   

    看看.可以直接使用null赋值给字段.