在C语言中调用Oracle存储过程是一个常见的数据库操作,通过存储过程可以封装常用的业务逻辑,简化代码的开发和维护,下面将详细介绍如何使用C语言调用Oracle存储过程,包括准备工作、编写C代码以及示例代码。
准备工作
1、安装Oracle客户端:在进行C语言调用之前,需要确保已经安装了Oracle客户端,并配置了相应的环境变量。
2、创建ODBC数据源:在使用C语言调用Oracle存储过程之前,需要先为程序创建ODBC数据源,可以通过Windows操作系统的“控制面板”中的“数据源(ODBC)”来创建ODBC数据源。
3、准备存储过程:确保在Oracle数据库中已经创建了需要调用的存储过程,一个简单的存储过程如下:
CREATE OR REPLACE PROCEDURE P_TEST (ID IN INT, Name OUT VARCHAR2, Result OUT INT) IS tmpVar NUMBER; BEGIN tmpVar := 0; Name := 'www.csdn.net'; Result := 123456; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN RAISE; END P_TEST;
编写C代码
以下是一个完整的C语言示例代码,演示如何调用上述存储过程:
#include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqlext.h> void report_error(SQLHANDLE Handle, SQLSMALLINT Type, SQLRETCODE RetCode) { SQLCHAR SqlState[6]; SQLINTEGER i = 0; SQLINTEGER NativeError; SQLCHAR MessageText[SQL_MAX_MESSAGE_LENGTH + 1]; SQLSMALLINT TextLengthPtr; SQLRETURN ret; printf("Error: %d ", RetCode); ret = SQLGetDiagRec(Handle, Type, i, SqlState, &NativeError, MessageText, sizeof(MessageText), &TextLengthPtr); while (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { printf("%s ", MessageText); i++; ret = SQLGetDiagRec(Handle, Type, i, SqlState, &NativeError, MessageText, sizeof(MessageText), &TextLengthPtr); } } int main() { SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN rc; SQLCHAR* datasource_name = "DSN=my_odbc_dsn"; // 替换为你的ODBC数据源名称 SQLCHAR* uid = "your_username"; // 替换为你的用户名 SQLCHAR* pwd = "your_password"; // 替换为你的密码 SQLINTEGER param1 = 10; SQLDOUBLE param3 = 0.0; SQLCHAR param4[20]; SQLINTEGER name_len = 0; // 分配连接句柄 rc = SQLAllocHandle(SQL_HANDLE_DBC, SQL_NULL_HANDLE, &hdbc); if (!SQL_SUCCEEDED(rc)) { printf("Connection allocation failed!"); return -1; } // 连接到数据库 rc = SQLConnect(hdbc, datasource_name, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS); if (!SQL_SUCCEEDED(rc)) { printf("Connection to oracle failed!"); return -1; } // 分配语句句柄 rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); if (!SQL_SUCCEEDED(rc)) { printf("Statement allocation failed!"); return -1; } // 准备SQL语句 SQLCHAR* sql = (SQLCHAR*)"{call P_TEST(?, ?, ?)}"; rc = SQLPrepare(hstmt, sql, SQL_NTS); if (!SQL_SUCCEEDED(rc)) { printf("Prepare sql failed!"); return -1; } // 绑定参数 rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, SQL_PARAM_INPUT, SQL_IS_INTO); rc = SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_VARCHAR, SQL_PARAM_OUTPUT, SQL_IS_STRING); rc = SQLBindParameter(hstmt, 3, SQL_PARAM_OUTPUT, SQL_C_DOUBLE, SQL_DOUBLE, SQL_PARAM_OUTPUT, SQL_IS_DOUBLE); // 执行SQL语句 rc = SQLExecute(hstmt); if (!SQL_SUCCEEDED(rc)) { printf("Execute sql failed!"); return -1; } // 获取输出参数的值 rc = SQLFetch(hstmt); if (!SQL_SUCCEEDED(rc)) { printf("Fetch data failed!"); return -1; } // 打印输出参数的值 printf("Name: %s ", param4); printf("Result: %f ", param3); // 断开与数据库的连接 rc = SQLDisconnect(hdbc); if (!SQL_SUCCEEDED(rc)) { printf("Disconnect failed!"); return -1; } SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); return 0; }
示例解释
1、错误处理函数:report_error
函数用于报告错误信息,帮助调试和定位问题。
2、主函数:main
函数是程序的入口,包含以下几个步骤:
分配连接句柄:使用SQLAllocHandle
函数分配一个数据库连接句柄hdbc
。
连接到数据库:使用SQLConnect
函数连接到指定的ODBC数据源。
分配语句句柄:使用SQLAllocHandle
函数分配一个语句句柄hstmt
。
准备SQL语句:使用SQLPrepare
函数准备一个包含存储过程调用的SQL语句。
绑定参数:使用SQLBindParameter
函数绑定输入和输出参数。
执行SQL语句:使用SQLExecute
函数执行准备好的SQL语句。
获取输出参数的值:使用SQLFetch
函数获取输出参数的值。
打印输出参数的值:将输出参数的值打印到控制台。
断开与数据库的连接:使用SQLDisconnect
函数断开与数据库的连接,并释放句柄资源。
相关问题与解答
问题1:如何在C语言中调用带多个参数的Oracle存储过程?
答:在C语言中调用带多个参数的Oracle存储过程时,可以使用SQLBindParameter
函数分别绑定每个参数,对于输入参数,使用SQL_PARAM_INPUT
标志;对于输出参数,使用SQL_PARAM_OUTPUT
标志,绑定完成后,使用SQLExecute
函数执行存储过程,并使用SQLFetch
函数获取输出参数的值。
问题2:如何处理C语言调用Oracle存储过程中的错误?
答:在C语言调用Oracle存储过程中,可以使用report_error
函数或其他类似的错误处理函数来报告错误信息,还可以在每个关键步骤后检查返回码,如果返回码指示失败,则进行相应的错误处理,如打印错误信息、释放资源等。
各位小伙伴们,我刚刚为大家分享了有关“c调用oracle 存储过程”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/1531.html<