OCI批量 新增 数据时数据长度的问题
字段q_id的类型为varchar(45),更新数据时,如果q_id字符串的长度刚好为45时,没有问题,可实际上q_id字符串的长度可能小于45,例如当q_id="ID1000"时,实际存入数据库中的值为"ID1000"+乱码,怎么解决?
表结构:
create table testtable
(
q_id varchar(45),
qq_flag varchar(2),
qvalue decimal(20,2)
)
批量新增数据的函数:
表结构:
create table testtable
(
q_id varchar(45),
qq_flag varchar(2),
qvalue decimal(20,2)
)
批量新增数据的函数:
int OCI_TOOLS::ORA_BindArrayWithupdatead(char *buff, float qvalue[], char q_id[][45],char qq_flag[][2],int maxiter)
{
text *sqltext;
int i;
sword ret1,ret2,ret3,ret4;
text msgbuf[512];
/* bind handles will be implicitly allocated in the bind calls */
/* need to initialize them to null prior to first usage in bind calls */
OCIBind *bnd1p = (OCIBind *) 0; /* the first bind handle */
OCIBind *bnd2p = (OCIBind *) 0; /* the second bind handle */
OCIBind *bnd3p = (OCIBind *) 0; /* the third bind handle */
text *sqlstmt = (text *)buff;
if (OCIStmtPrepare(stmthp, errhp, sqlstmt, (ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT))
{
(void) printf("FAILED: OCIStmtPrepare() update\n");
//report_error(errhp);
return OCI_ERROR;
}
ret1=OCIBindByPos(stmthp, &bnd1p,errhp, (ub4) 1,
(dvoid *) qvalue, (sb4) 4, SQLT_FLT,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
ret3=OCIBindByPos(stmthp, &bnd3p,errhp, (ub4) 3,
(dvoid *) q_id, (sb4) 45, SQLT_CHR,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
ret2=OCIBindByPos(stmthp, &bnd2p,errhp, (ub4) 2,
(dvoid *) qq_flag, (sb4) 2, SQLT_CHR,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
if (ret1||ret2||ret3)
{
(void) printf("FAILED: OCIBindArrayOfStruct()\n");
//report_error(errhp);
return OCI_ERROR;
}
ret1=OCIBindArrayOfStruct(bnd1p,errhp, 4, 0, 0, 0);
ret3=OCIBindArrayOfStruct(bnd3p,errhp, 45, 0, 0, 0);
ret2=OCIBindArrayOfStruct(bnd2p,errhp, 2, 0, 0, 0);
if (ret1||ret2||ret3)
{
(void) printf("FAILED: OCIBindArrayOfStruct()\n");
//report_error(errhp);
return OCI_ERROR;
}
if (OCIStmtExecute(svchp, stmthp,errhp, (ub4) maxiter, (ub4) 0,
(CONST OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_COMMIT_ON_SUCCESS))
{
(void) printf("FAILED: OCIStmtExecute() update ccbase\n");
//report_error(errhp);
sb4 errcode = 0;
(void) OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
(void) printf("ERROR CODE = %d\n", errcode);
(void) printf("%.*s\n", 512, msgbuf);
return OCI_ERROR;
}
status=OCITransCommit(svchp,errhp,0);
if(status!=OCI_SUCCESS)
{
error_proc(errhp,status);
return OCI_FAIL;
}
return OCI_SUCCESS;
}
...全文
相关推荐
用OCI开发ORACLE数据库的方法.pdf
- **绑定和描述符**:oci中的绑定是指将程序变量与SQL语句中的占位符关联,而描述符则用于存储关于列的信息,如数据类型、长度等。这些概念在执行SQL语句和处理结果集时非常关键。
OCI_LOB样例程序
OCI事务管理: 在处理LOB时,通常需要在事务上下文中进行,确保数据的一致性。样例程序可能包括开始事务、提交和回滚操作。5.
OCI操作oracle数据库[收集].pdf
描述 SQL 中的输出的数据。如果有必要的话,我们可以调用函数 OCIParamGet() 与 OCIAttrGet() 来获取我们所读取的记录的字段个数、字段的数据类型以及字段数据定义的最大长度。
OCI编程简介
OCI编程注意事项- **一:关于输出变量定义**: 输出变量的定义要与SQL语句中的列类型和长度匹配。
C编写的OCI连接Oracle数据库.pdf
这些知识不仅包括了数据库操作的具体API调用,也包括了C语言与数据库交互时必须注意的资源管理、内存操作以及数据类型处理等问题。理解和掌握这些知识点,对于进行高效且稳定的数据库编程至关重要。


数据库
