达梦(DM)数据库存储模块的调用

MoMo 2021年6月14日15:17:09
评论
19

存储模块的调用

调用存储模块的方法可以分为两种情况。

1. 立即调用

如果存储过程需要设置参数,那么在调用存储模块的时候就已经为所有的  ININOUT

类型的参数进行了赋值,带有 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/
MoMo
  • 本文由 发表于 2021年6月14日15:17:09
  • 转载请务必保留本文链接:https://xpanx.com/2943.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: