Skip to content

存储函数使用示例

sql
create or replace function GetName(uid int) return char
as
declare
username char;
begin
  select name into username from mytable where id = uid;
  return username;
end;
c
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>

void main(void) 
{
    SQLHENV henv;   /* 环境句柄 */
    SQLHDBC hdbc;   /* 连接句柄 */
    SQLHSTMT hstmt; /* 语句句柄 */
    SQLRETURN ret;  /* 返回代码 */

    /* 申请一个环境句柄 */
    SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
    /* 设置环境句柄的 ODBC 版本 */
    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    /* 申请一个连接句柄 */
    SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    ret = SQLConnect(hdbc, (SQLCHAR*)"XuguDB", SQL_NTS, (SQLCHAR*)"SYSDBA", SQL_NTS, (SQLCHAR*)"SYSDBA", SQL_NTS);
    /* 申请一个语句句柄 */
    SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    strcpy(sql, "GetName(?)");
    int id = 100;
    char name[20] = {};
    SQLLEN len1 = 4;
    SQLLEN len2 = 20;
    /* 绑定参数 */
    ret = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 4, &len1);
    /* 绑定函数返回值 */
    ret = SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, name, 20, &len2);
    /* 执行函数 */
    ret = SQLExecDirect(hstmt, (SQLCHAR*)sql, SQL_NTS);

    printf("name: %s\n", name);

    /* 释放语句句柄 */
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    /* 提交连接上的事务 */
    SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
    /* 断开与数据源之间的连接 */
    SQLDisconnect(hdbc);
    /* 释放连接句柄 */
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    /* 释放环境句柄 */
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
}