bool update_blob(BLOBPIC **blobsub, OCILobLocator **blob)
{
text *update = (text *)"SELECT pic FROM blobpic WHERE pid = :1 FOR UPDATE";
OCIBind *bndhp1 = NULL;
OCIDefine *defhp1 = NULL;
sb4 status = 0;
bool ersign = 1;
BLOBPIC *tempid = NULL; //用来临时保存PID
//tempid = blobsub->pid;
//prepare to update
ersign = ersign & CheckErr(errhp, OCIStmtPrepare(stmthp, errhp, (oratext *)update, (sb4)strlen((char *)update), OCI_NTV_SYNTAX, OCI_DEFAULT)); ersign = ersign & CheckErr(errhp, OCIBindByPos(stmthp, &bndhp1, errhp, 1, blobsub[0]->pid,(sb4)sizeof(blobsub[0]->pid), SQLT_INT,&blobsub[0]->indic, &blobsub[0]->alen, &blobsub[0]->rcodep, MAXPICNUM, &blobsub[0]->curelp, OCI_DEFAULT));
OCIBindArrayOfStruct(bndhp1, errhp, sizeof(blobsub[0]->pid), sizeof(sb2), sizeof(ub2), sizeof(ub2), sizeof(ub2)); //批量处理 ersign = ersign & CheckErr(errhp, OCIDefineByPos(stmthp, &defhp1, errhp, 1, (void *)blob[0], (sb4)sizeof(blob[0]), SQLT_BLOB, 0, 0, 0, OCI_DEFAULT));
OCIDefineArrayOfStruct(defhp1, errhp, sizeof(blob),sizeof(sb2), sizeof(ub2), sizeof(ub2)); //update
status = OCIStmtExecute(svchp, stmthp, errhp, MAXPICNUM, 0, NULL, NULL, OCI_DEFAULT); if(status && status != OCI_SUCCESS_WITH_INFO) //出错则返回
{
CheckErr(errhp, status);
OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV);
return FALSE;
} return ersign;
}
运行时出现"编译绑定长度不同于执行绑定长度"的错误代码
MAXPICNUM 为3
是不是哪儿的参数错了?OCIBindByPos()的最后那几个指针是否必须为指针?数组可以么?alenp 与indp rcodep maxarr_len curelep 他们都必须要设置么?谢谢!!
{
text *update = (text *)"SELECT pic FROM blobpic WHERE pid = :1 FOR UPDATE";
OCIBind *bndhp1 = NULL;
OCIDefine *defhp1 = NULL;
sb4 status = 0;
bool ersign = 1;
BLOBPIC *tempid = NULL; //用来临时保存PID
//tempid = blobsub->pid;
//prepare to update
ersign = ersign & CheckErr(errhp, OCIStmtPrepare(stmthp, errhp, (oratext *)update, (sb4)strlen((char *)update), OCI_NTV_SYNTAX, OCI_DEFAULT)); ersign = ersign & CheckErr(errhp, OCIBindByPos(stmthp, &bndhp1, errhp, 1, blobsub[0]->pid,(sb4)sizeof(blobsub[0]->pid), SQLT_INT,&blobsub[0]->indic, &blobsub[0]->alen, &blobsub[0]->rcodep, MAXPICNUM, &blobsub[0]->curelp, OCI_DEFAULT));
OCIBindArrayOfStruct(bndhp1, errhp, sizeof(blobsub[0]->pid), sizeof(sb2), sizeof(ub2), sizeof(ub2), sizeof(ub2)); //批量处理 ersign = ersign & CheckErr(errhp, OCIDefineByPos(stmthp, &defhp1, errhp, 1, (void *)blob[0], (sb4)sizeof(blob[0]), SQLT_BLOB, 0, 0, 0, OCI_DEFAULT));
OCIDefineArrayOfStruct(defhp1, errhp, sizeof(blob),sizeof(sb2), sizeof(ub2), sizeof(ub2)); //update
status = OCIStmtExecute(svchp, stmthp, errhp, MAXPICNUM, 0, NULL, NULL, OCI_DEFAULT); if(status && status != OCI_SUCCESS_WITH_INFO) //出错则返回
{
CheckErr(errhp, status);
OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV);
return FALSE;
} return ersign;
}
运行时出现"编译绑定长度不同于执行绑定长度"的错误代码
MAXPICNUM 为3
是不是哪儿的参数错了?OCIBindByPos()的最后那几个指针是否必须为指针?数组可以么?alenp 与indp rcodep maxarr_len curelep 他们都必须要设置么?谢谢!!
解决方案 »
- ORACL 用户密码中有 @ 怎么用SQLPLUS 登陆
- oracle包与包体的区别,以及如何查看包内的存储过程实现
- 1000万条数据如何insert
- (100分)对于记录量比较大的分页显示,如果为了提高分页效率,可以在数据库(oracle)中写存储过程来解决分页,如何写??(急等)
- ORACLE专业级技术交流平台(18891623) 欢迎专业人士加入
- 有没有不用输入参数的function?或者代替的东西?
- 又升一个三叉,散分200
- 出现错误:Ora:01041内部错误,HostDef扩展名不存在!什么原因,如何解决??
- 用sql语句怎么查询介于两个日期之间到底有没有数据
- Oracle truncate table xx 急救...
- 关于索引表使用的问题
- 急!!!!!!!查询表中某列上是否有重复记录,有就显示的问题,高效率的!
bool insert_null_blob(BLOBPIC **blobsub, OCILobLocator **blob)
{
bool ersign = 1; //用于错误检测
OCIBind *bndhp1 = NULL,
*bndhp2 = NULL,
*bndhp3 = NULL;
ub4 status = 0;
BLOBPIC *tempstrc = NULL; //保存临时结构
sb4 temid; //保存临时ID
sb4 tempid; //保存临时PID
text *insert = (text *)"INSERT INTO blobpic VALUES(:1, empty_blob(), :2)"; assert(blobsub);
assert(blob); /*
tempstrc = blobsub;
temid = tempstrc->patientid;
tempid = tempstrc->pid;*/
//insert a null BLOB
ersign = ersign|CheckErr(errhp, OCIStmtPrepare(stmthp, errhp, (oratext *)insert, (sb4)strlen((char *)insert), OCI_NTV_SYNTAX, OCI_DEFAULT)); //Attrset to NULL
//OCIAttrSet(*blob, OCI_DTYPE_LOB, (dvoid*)0, (ub4)0, OCI_ATTR_LOBEMPTY, errhp); //将locator指向的blob置空
ersign = ersign|CheckErr(errhp, OCIBindByPos(stmthp, &bndhp1, errhp, 1, blobsub[0]->patientid, (sb4)sizeof(blobsub[0]->patientid), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIBindArrayOfStruct(bndhp1, errhp, sizeof(blobsub[0]->patientid), 0, 0, 0)); /*
ersign = ersign|CheckErr(errhp, OCIBindByPos(stmthp, &bndhp2, errhp, 2, *blob, (sb4)sizeof(blob), SQLT_BLOB, 0, 0, 0, 0, 0, OCI_DEFAULT));
OCIBindArrayOfStruct(bndhp1, errhp, sizeof(blob), 0, 0, 0);*/
ersign = ersign|CheckErr(errhp, OCIBindByPos(stmthp, &bndhp3, errhp, 2, blobsub[0]->pid, (sb4)sizeof(blobsub[0]->pid), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIBindArrayOfStruct(bndhp1, errhp, sizeof(blobsub[0]->pid), 0, 0, 0)); //insert an empty BLOB
status = OCIStmtExecute(svchp, stmthp, errhp, MAXPICNUM, 0, NULL, NULL, OCI_DEFAULT);
if(status && status != OCI_SUCCESS_WITH_INFO)
{
CheckErr(errhp, status);
OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV);
return FALSE;
}
printf("The empty record has been inserted into the database!\n");
printf("Beginning to update the BOLB...\n"); //commit
//OCITransCommit(svchp, errhp, 0);
return ersign;
}
这个是批量插入空值的 老在执行的那步出写入错误
OCIBind **bindpp,
OCIError *errhp,
ub4 position,// 绑定的位置
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode ); 后面的几个参数中有一个参数需要赋值,设置好了就插入空值也可以,
不知是indp还是alenp,
目前也在尝试中。。