示例¶
此示例显示调用有返回值的存储过程并获取结果。存储过程的调用使用ODBC的CALL语法;返回值作为SQL语句的输出参数,返回的数据用结果集绑定方式获取。
示例中使用存储过程ADDSum(),它用两个整数为参数,并返回两者之和。
// create or replace procedure ADDSum(i int,j int) return int as
// declare
// temp_sum int;
// begin
// temp_sum = i+j;
// return temp_sum;
// end;
// language 'plOSCAR';
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
SQLINTEGER Sum, ParamA, ParamB, SumInd=0, ParamAInd=0, ParamBInd=0;
SQLCHAR *statement = (SQLCHAR*)"{? = call ADDSum(?, ?)}";
RETCODE retcode;
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int GetParam(SQLINTEGER *a,SQLINTEGER *b) {
*a = 1;
*b = 2;
return 1;
}
int main()
{
// 分配ODBC环境句柄
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// 指定应用程序ODBC版本
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
// 分配ODBC连接句柄并连接
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1,(SQLCHAR*)"OSRDBSource", SQL_NTS,(SQLCHAR*)"sysdba", SQL_NTS, (SQLCHAR*)"szoscar55",SQL_NTS);
// 分配语句句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
// 绑定输出参数
retcode = SQLBindParameter(hstmt1, 1, SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &Sum, 0, &SumInd);
// 绑定输入参数
retcode = SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &ParamA, 0, &ParamAInd);
retcode = SQLBindParameter(hstmt1, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &ParamB, 0, &ParamBInd);
// 应用程序获取输入参数的值
if (GetParam(&ParamA, &ParamB)) {
// 执行SQL语句
retcode = SQLExecDirect(hstmt1, statement, SQL_NTS);
printf("SUM = %d\n", Sum);
}
SQLFreeStmt(hstmt1, SQL_CLOSE);
// 释放语句句柄
// 断开连接
// 释放连接句柄和环境句柄
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}