淘先锋技术网

首页 1 2 3 4 5 6 7

C语言可以通过OCI(Oracle Call Interface)实现对Oracle数据库的连接和操作。其中,调用存储过程是常见的操作之一,下面详细介绍如何使用C语言调用Oracle存储过程。

在调用Oracle存储过程之前,需要先连接到数据库,OCI提供了几个重要的函数来完成连接。

…
OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
OCIHandleAlloc(envhp, (dvoid *)&errhp, OCI_HTYPE_ERROR, 0, 0);
OCIHandleAlloc(envhp, (dvoid *)&srvhp, OCI_HTYPE_SERVER, 0, 0);
OCIServerAttach(srvhp, errhp, (text *)conn_str, strlen((char *)conn_str), OCI_DEFAULT);
OCIHandleAlloc(envhp, (dvoid *)&authp, OCI_HTYPE_SESSION, 0, 0);
OCIAttrSet(authp, OCI_HTYPE_SESSION, (dvoid *)user, strlen(user), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(authp, OCI_HTYPE_SESSION, (dvoid *)pass, strlen(pass), OCI_ATTR_PASSWORD, errhp);
OCISessionBegin(srvhp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIHandleAlloc(envhp, (dvoid *)&svchp, OCI_HTYPE_SVCCTX, 0, 0);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp, 0, OCI_ATTR_SERVER, errhp);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)authp, 0, OCI_ATTR_SESSION, errhp);
…

例子中,用户需要在conn_str中输入连接字符串,如"连接名/用户名/密码",在user和pass中输入用户名和密码,均为字符串类型。最后调用OCISessionBegin()完成连接。

连接到数据库后,即可开始调用存储过程。OCI提供OCIStmtPrepare()函数来完成SQL语句的预编译,OCIStmtExecute()函数来执行SQL语句。

…
OCIStmtPrepare(stmthp, errhp, (text *)sql_str, strlen(sql_str), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtSetPieceInfo(stmthp, OCI_HTYPE_STMT, (dvoid *)in_val, &in_len, OCI_FIRST_PIECE, OCI_ONE_PIECE, OCI_DATA_AT_EXEC);
...
OCIStmtSetPieceInfo(stmthp, OCI_HTYPE_STMT, (dvoid *)out_val, &out_len, OCI_LAST_PIECE, OCI_ONE_PIECE, OCI_DATA_AT_EXEC);
OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, (dvoid **)&cparam, 30);
OCIAttrGet(cparam, OCI_DTYPE_PARAM, (dvoid *)&type, (ub4 *)&type_len, OCI_ATTR_TYPE_NAME, errhp);
OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *)out_val, out_len, type, (dvoid *)&(indicators[0]), (ub2 *)&(lengths[0]), NULL, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
…

例子中的sql_str为存储过程的调用字符串,其中包括了输入和输出参数。输入参数使用OCIBindByPos()函数绑定,输出参数使用OCIDefineByPos()函数绑定。OCIStmtExecute()执行SQL语句后即可获得存储过程的输出结果。

在调用存储过程时,也需要注意一些细节问题。例如,输入参数需要使用OCI_DATA_AT_EXEC方式传递,在OCIStmtExecute()函数之前需要调用OCIStmtSetPieceInfo()设置传递方式;输出参数需要使用OCI_DEFAULT方式传递,需要使用OCIParamGet()函数获取输出参数的类型,再使用OCIDefineByPos()函数绑定。

通过以上介绍,我们可以掌握使用C语言调用Oracle存储过程的技巧。在实际操作中,需要根据具体的需求和参数来编写调用代码。