示例

此示例显示调用有返回值的存储过程并获取结果。存储过程的调用使用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;
}