存储模块的调用
调用存储模块的方法可以分为两种情况。
1. 立即调用
如果存储过程需要设置参数,那么在调用存储模块的时候就已经为所有的 IN、INOUT
类型的参数进行了赋值,带有 OUT 属性的参数的值是通过取得存储过程结果集的方法获取
的。立即执行存储过程的示例如下:
SQLExecDirect(hsmt,(SQLCHAR*)"call test_proc(123);",SQL_NTS);
2. 参数调用
这种调用方法指的是在调用模块的时候,其参数值用问号来代替,发送给服务器之后,
服务器返回参数的准备信息,用户依据服务器返回的参数描述信息进行参数绑定,然后执行,
其参数的处理方法与普通的参数处理方法相同。
DM 支持存储模块返回多个结果集的处理,多结果集的切换通过 SQLMoreResult 函数切
换,下面通过一个实例来说明如何使用。
#include <windows.h> #include <stdio.h> #include <sql.h> #include <sqltypes.h> #include <sqlext.h> HENV env; HDBC dbc; HSTMT stmt; RETCODEret; short i; short cols; char colname[129]; char coldata[256]; void main(void) { SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); SQLConnect(dbc, (SQLCHAR *)"DM", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS); SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, (SQLCHAR *)"drop table test_table1;", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"drop table test_table2;", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"create table test_table1 (t1col int);", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"insert into test_table1 values(100);", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"create table test_table2 (t2col varchar(10));", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"insert into test_table2 values('hello!');", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"create or replace procedure test_proc as begin select * from test_table1;select * from test_table2;end;", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"call test_proc;", SQL_NTS); SQLNumResultCols(stmt, &cols); for (i=1; i<=cols; i++) { SQLDescribeCol(stmt, i, (SQLCHAR *)colname, 129, NULL, NULL, NULL, NULL, NULL); printf("%s ", colname); } printf("\n"); for ( ; ; ) { ret = SQLFetch(stmt); if (ret == SQL_NO_DATA_FOUND) break; for (i=1; i<=cols; i++) { SQLGetData(stmt, i, SQL_C_CHAR, coldata, 256, NULL); printf("%s ", coldata); } printf("\n"); } SQLMoreResults(stmt); SQLNumResultCols(stmt, &cols); for (i=1; i<=cols; i++) { SQLDescribeCol(stmt, i, (SQLCHAR *)colname, 129, NULL, NULL, NULL, NULL, NULL); printf("%s ", colname); } printf("\n"); for ( ; ; ) { ret = SQLFetch(stmt); if (ret == SQL_NO_DATA_FOUND) break; for (i=1; i<=cols; i++) { SQLGetData(stmt, i, SQL_C_CHAR, coldata, 256, NULL); printf("%s ", coldata); } printf("\n"); } SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); }
https://xpanx.com/
评论