Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


支持的 API

📄字数 19.9K
👁️阅读量 加载中...

OCIInitialize

功能

初始化 OCI 进程环境。仅做兼容,无实现。

原型

C
sword OCIInitialize(ub4 mode, const void* ctxp,
                    const void* (*malocfp)(void* ctxp, size_t size),
                    const void* (*ralocfp)(void* ctxp, void* memptr, size_t newsize),
                    const void (*mfreefp)(void* ctxp, void* memptr));

参数

  • mode:指定初始化模式
  • ctxp:用户自定义的内存回调上下文
  • malocfp:用户自定义的内存分配函数
  • ralocfp:用户自定义的内存分配函数
  • mfreefp:用户自定义的内存释放函数

示例

C
OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);

OCIEnvInit

功能

分配并初始化一个 OCI 环境句柄。

原型

C
sword OCIEnvInit(OCIEnv** envhpp, ub4 mode,
                 size_t xtramemsz, void** usrmempp);

参数

  • envhpp:环境句柄指针的地址
  • mode:指定初始化环境的模式,未使用
  • xtramemsz:指定被分配的用户内存总数,单位为字节
  • usrmempp:返回通过此函数调用分配的用户内存指针

说明

通过 usrmempp 获取的内存与其句柄拥有相同的生命周期,用户无需且不可自行释放此内存。

示例

C
OCIEnv* envhp;
if (OCIEnvInit(&envhp, OCI_DEFAULT, 0, NULL) == OCI_SUCCESS) {
    // do something
} else {
    // handle error
}

OCIEnvCreate

功能

创建并初始化一个环境句柄。

原型

C
sword OCIEnvCreate(OCIEnv** envp, ub4 mode, void* ctxp,
                   void* (*malocfp)(void* ctxp, size_t size),
                   void* (*ralocfp)(void* ctxp, void* memptr, size_t newsize),
                   void  (*mfreefp)(void* ctxp, void* memptr),
                   size_t xtramem_sz, void** usrmempp);

参数

  • envp:环境句柄指针的地址
  • mode:指定初始化模式,未使用
  • ctxp:指定用户定义的内存回调上下文
  • malocfp:指定用户自定义的内存分配函数
  • ralocfp:指定用户自定义的内存重新分配函数
  • mfreefp:指定用户自定义的内存释放函数
  • xtramem_sz:指定分配的用户内存数,单位为字节
  • usrmempp:返回分配的用户内存指针

说明

若调用此接口指定了自定义的内存函数,调用参数含有 xtramem_sz 和 usrmempp 的接口时,将使用用户自定义的内存函数。

通过 usrmempp 获取的内存与其句柄拥有相同的生命周期,用户无需且不可自行释放此内存。

示例

C
OCIEnv* envhp;
if (OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL) == OCI_SUCCESS) {
    // do something
} else {
    // handle error
}

OCIHandleAlloc

功能

返回一个已分配并已初始化的句柄。

原型

C
sword OCIHandleAlloc(const void* parenth, void** hndlpp, const ub4 type,
                     const size_t xtramem_sz, void** usrmempp);

参数

  • parenth:环境句柄
  • hndlpp:待返回的句柄
  • type:待返回的句柄类型,支持的类型如下:
    • OCI_HTYPE_ENV
    • OCI_HTYPE_ERROR
    • OCI_HTYPE_SVCCTX
    • OCI_HTYPE_STMT
    • OCI_HTYPE_SERVER
    • OCI_HTYPE_SESSION
  • xtramem_sz:指定分配的用户内存数
  • usrmempp:返回分配的用户内存指针

说明

通过 usrmempp 获取的内存与其句柄拥有相同的生命周期,用户无需且不可自行释放此内存。

示例

C
OCIEnv* env;
OCIServer* server;
OCIError* err;
OCISession* session;
OCISvcCtx* ctx;
OCIStmt* stmt;
OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
OCIHandleAlloc(env, &server, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(env, &err, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(env, &session, OCI_HTYPE_SESSION, 0, NULL);
OCIHandleAlloc(env, &ctx, OCI_HTYPE_SVCCTX, 0, NULL);
OCIHandleAlloc(env, &stmt, OCI_HTYPE_STMT, 0, NULL);

OCIHandleFree

功能

释放句柄。

原型

C
sword OCIHandleFree(void* hndlp, const ub4 type);

参数

  • hndlp:句柄
  • type:句柄类型

示例

C
OCIHandleFree(stmt, OCI_HTYPE_STMT);
OCIHandleFree(ctx, OCI_HTYPE_SVCCTX);
OCIHandleFree(session, OCI_HTYPE_SESSION);
OCIHandleFree(err, OCI_HTYPE_ERROR);
OCIHandleFree(server, OCI_HTYPE_SERVER);
OCIHandleFree(env, OCI_HTYPE_ENV);

OCIServerAttach

功能

为 OCI 相关操作创建一个数据库的访问路径。

原型

C
sword OCIServerAttach(OCIServer* srvhp, OCIError* errhp,
                      const OraText* dblink, sb4 dblink_len, ub4 mode);

参数

  • srvhp:服务器句柄
  • errhp:错误句柄
  • dblink:连接串,如:127.0.0.1:5138/SYSTEM
  • dblink_len:连接串的长度
  • mode:指定操作的模式,未使用

示例

C
const char* serverInfo = "127.0.0.1:5138/SYSTEM";
ret = OCIServerAttach(server, error, (OraText*)serverInfo, strlen(serverInfo), 0);

说明

Oracle OCI 在调用此接口时建立 Socket 连接,若连接信息有误,通过返回值可获得。但 XuguDB-OCI 建立连接和登录数据库是一步操作,在 ServerAttach 时并未连接数据库,因此无法知道连接信息正确与否。

OCIServerDetach

功能

删除 OCI 相关操作一个数据库的访问路径。仅兼容,无实现。

原型

C
sword OCIServerDetach(OCIServer* srvhp, OCIError* errhp, ub4 mode);

参数

  • srvhp:已初始化的服务器句柄
  • errhp:错误句柄
  • mode:指定操作的模式

示例

C
OCIServerDetach(server, err, OCI_DEFAULT);

OCIErrorGet

功能

返回错误消息和错误编码。

原型

C
sword OCIErrorGet(void* hndlp, ub4 recordno, OraText* sqlstate,
                  sb4* errcodep, OraText* bufp, ub4 bufsiz, ub4 type);

参数

  • hndlp:错误句柄
  • recordno:指示状态记录,从1开始
  • sqlstate:8.x 及之后不再支持,未使用
  • errcodep:错误编码,未使用
  • bufp:返回错误信息的缓冲区
  • bufsiz:接收错误信息的缓冲区大小
  • type:句柄类型

示例

C
char buf[128];
OCIErrorGet(err, 0, NULL, NULL, (OraText*)buf, 128, OCI_HTYPE_ERROR);

说明

XuguDB-OCI 仅支持 recordno 为 1,否则返回 CI_NO_DATA。type 仅支持 OCI_HTYPE_ERROR 或 OCI_HTYPE_ENV。

OCIAttrSet

功能

为句柄设置属性值。

原型

C
sword OCIAttrSet(void* trgthndlp, ub4 trghndltyp, void* attributep,
                 ub4 size, ub4 attrtype, OCIError* errhp);

参数

  • trgthndlp:句柄
  • trghndltyp:句柄类型
  • attributep:指向属性值的指针
  • size:属性值的大小
  • attrtype:属性类型
  • errhp:错误句柄

说明

  • OCI_HTYPE_SVCCTX
    • OCI_ATTR_SERVER:设置服务器句柄
    • OCI_ATTR_SESSION:设置会话句柄
    • OCI_ATTR_CHARSET:设置字符集
  • OCI_HTYPE_SESSION
    • OCI_ATTR_USERNAME:设置用户名
    • OCI_ATTR_PASSWORD:设置密码

示例

C
OCIAttrSet(ctx, OCI_HTYPE_SVCCTX, session, 0, OCI_ATTR_SESSION, err);
OCIAttrSet(session, OCI_HTYPE_SESSION, username, strlen(username), OCI_ATTR_USERNAME, err);
OCIAttrSet(session, OCI_HTYPE_SESSION, pwd, strlen(pwd), OCI_ATTR_PASSWORD, err);

OCIParamGet

功能

从语句句柄中获取指定位置的参数描述符。

原型

C
sword OCIParamGet(const void* hndlp, ub4 htype, OCIError* errhp,
                  void** parmdpp, ub4 pos);

参数

  • hndlp:仅支持语句句柄
  • htype:句柄类型
  • errhp:错误句柄
  • parmdpp:参数描述符的地址
  • pos:语句句柄中的位置

示例

C
OCIParam* para;
OCIParamGet(stmt, OCI_HTYPE_STMT, err, &para, 1);

OCIAttrGet

功能

获取句柄的属性值。

原型

C
sword OCIAttrGet(const void* trgthndlp, ub4 trghndltyp,
                 void* attributep, ub4* sizep, ub4 attrtype,
                 OCIError* errhp);

参数

  • trgthndlp:句柄
  • trghndltyp:句柄类型
  • attributep:接收属性值的缓冲区
  • sizep:属性值大小
  • attrtype:属性类型
  • errhp:错误句柄

说明

  • OCI_HTYPE_DEFINE
    • OCI_ATTR_HANDLE_POSITION:获取句柄的列号
  • OCI_HTYPE_BIND
    • OCI_ATTR_HANDLE_POSITION:获取参数的位置编号
  • OCI_HTYPE_SVCCTX
    • OCI_ATTR_SERVER:获取服务器句柄
    • OCI_ATTR_SESSION:获取会话句柄
    • OCI_HTYPE_SERVER:未支持
  • OCI_HTYPE_SERVER:未支持
  • OCI_HTYPE_SESSION
    • OCI_ATTR_USERNAME:获取用户名
  • OCI_HTYPE_STMT
    • OCI_ATTR_ROWS_FETCHED:获取已 fetch 的行数
    • OCI_ATTR_ROW_COUNT:获取已 fetch 的总行数
    • OCI_ATTR_STATEMENT:获取 SQL 语句
    • OCI_ATTR_PARAM_COUNT:获取参数个数
  • OCI_DTYPE_PARAM
    • OCI_ATTR_DATA_TYPE:获取数据类型
    • OCI_ATTR_DATA_SIZE:获取数据大小

示例

C
OCIParam* para;
ret = OCIParamGet(stmt, OCI_HTYPE_STMT, err, &para, 1);

ub2 dataType;
text* colName;
ub4 dataSize;
text* typeName;
ub4 colNameLen;
ub4 typeNameLen;
OCIAttrGet(para, OCI_DTYPE_PARAM, &dataType, NULL, OCI_ATTR_DATA_TYPE, err);
OCIAttrGet(para, OCI_DTYPE_PARAM, &colName, &colNameLen, OCI_ATTR_NAME, err);
OCIAttrGet(para, OCI_DTYPE_PARAM, &dataSize, NULL, OCI_ATTR_DATA_SIZE, err);
OCIAttrGet(para, OCI_DTYPE_PARAM, &typeName, &typeNameLen, OCI_ATTR_TYPE_NAME, err);

OCISessionBegin

功能

创建一个用户会话。

原型

C
swor OCISessionBegin(OCISvcCtx* svchp, OCIError* errhp, OCISession* usrhp,
                     ub4 credt, ub4 mode);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • usrhp:会话句柄
  • credt:指定建立用户会话的凭证类型,未使用
  • mode:指定操作的模式,未使用

说明

XuguDB-OCI 的此接口进行连接的建立和数据库的登录,若连接信息有误,此接口返回错误信息。

示例

C
OCISessionBegin(ctx, err, session, OCI_CRED_RDBMS, OCI_DEFAULT);

OCISessionEnd

功能

终止一个由 OCISessionBegin 创建的会话上下文。

原型

C
sword OCISessionEnd(OCISvcCtx* svchp, OCIError* errhp, OCISession* usrhp,
                    ub4 mode);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • usrhp:会话句柄
  • mode:仅有效的模式为 OCI_DEFAULT

说明

在中止会话前,若存在未提交的事务,事务将被提交。

示例

C
OCISessionEnd(ctx, err, session, OCI_DEFAULT);

OCIStmtPrepare

功能

准备一个待执行的 SQL 语句。

原型

C
sword OCIStmtPrepare(OCIStmt* stmtp, OCIError* errhp, const OraText* stmt,
                     ub4 stmt_len, ub4 language, ub4 mode);

参数

  • stmtp:语句句柄
  • errhp:错误句柄
  • stmt:SQL 语句
  • stmt_len:SQL 语句长度
  • language:指定 V7 或本地语法,取值:OCI_V7_SYNTAX、OCI_NTV_SYNTAX、OCI_FOREIGN_SYNTAX,未使用
  • mode:模式,未使用

示例

C
cosnt char* sql = "SELECT * FROM tab_test WHERE id = ?";
ret = OCIStmtPrepare(stmt, err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

OCIDefineByPos

功能

将变量关联到 Select 结果集的列。

原型

C
sword OCIDefineByPos(OCIStmt* stmtp, OCIDefine** defnp, OCIError* errhp,
                     ub4 position, void* valuep, sb4 value_sz, ub2 dty,
                     void* indp, ub2* rlenp, ub2* rcodep, ub4 mode);

参数

  • stmtp:语句句柄
  • defnp:定义句柄
  • errhp:错误句柄
  • position:列号,从1开始
  • valuep:变量的指针
  • value_sz:变量的大小
  • dty:数据类型
  • indp:指向指示器的指针
  • rlenp:指向数据长度的指针
  • rcodep:指向列级代码的指针
  • mode:模式

说明

indp 指向 sb2 类型的变量,在 Oracle 中用于 -1 表示列值为 NULL,0 表示非 NULL,大于 0 表示数据发生截断,其值为列值的实际长度。XuguDB-OCI 暂未兼容此用法。

rcodep 在 Oracle 中指向 ub2 类型变量,但在 XuguDB-OCI 中此参数需指向 sb4 类型变量,且用此变量指示列值是否为 NULL,列值为 NULL 其值为 -1。

若 valuep 为数组时,value_sz 为单个变量大小,indp、rlenp 和 rcodep 均与 valuep 数组元素个数一致。

示例

C
OCIDefine* def;
int id;
ub2 len;
sb4 rcode;
ret = OCIDefineByPos(stmt, &def, err, 1, &id, 4, SQLT_INT, NULL, &len, &rcode, OCI_DEFAULT);

OCIBindByPos

功能

创建程序变量到 SQL 占位符的关联关系。

原型

C
sword OCIBindByPos(OCIStmt* stmtp, OCIBind** bindp, OCIError* errhp,
                   ub4 position, void* valuep, sb4 value_sz,
                   ub2 dty, void* indp, ub2* alenp, ub2* rcodep,
                   ub4 maxarr_len, ub4* curelep, ub4 mode);

参数

  • stmtp:语句句柄
  • bindp:绑定句柄
  • errhp:错误句柄
  • position:占位符的位置,从1开始
  • valuep:变量的指针
  • value_sz:变量的大小
  • dty:数据类型
  • indp:指向指示器变量的指针
  • alenp:数据实际大小
  • rcodep:指向列级代码的数组指针
  • maxarr_len:最大数组长度,未使用
  • curelep:当前数组长度,未使用
  • mode:模式

说明

在 Oracle 中,indp 用于指示列值是否为 NULL,此指针指向 sb2 类型变量,-1 表示 NULL,0 表示非 NULL。alenp 表示列值的实际大小,当取值为 0 时,列值为 NULL。rcodep 用于输出参数。在绑定数组时,valuep、indp、alenp、rcodep 均指向数组,value_sz 为单个变量的大小,maxarr_len 为 0,curelep 为 NULL。

在 XuguDB-OCI 中,对 Oracle 的兼容存在部分问题。列值的实际大小对应 value_sz,而 alenp 未使用。indp 与 Oracle 保持一致。支持数组的绑定,由于 alenp 存在兼容性问题,因此在绑定字符串数组时存在字符串长度无法单个指定的问题。

示例

C
OCIBind* bind[2];
int id = 1;
char name[20] = "HELLO";
sb2 ind[2] = { 0,0 };
OCIBindByPos(stmt, &bind[0], err, 1, &id, 4, SQLT_INT, &ind[0], NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIBindByPos(stmt, &bind[1], err, 2, name, strlen(name), SQLT_CHR, &ind[1], NULL, NULL, 0, NULL, OCI_DEFAULT);

OCIBindByName

功能

在程序变量与 SQL 占位符间创建关联关系。

原型

C
sword OCIBindByName(OCIStmt* stmtp, OCIBind** bindp, OCIError* errhp,
                    const OraText* placeholder, sb4 placeh_len,
                    void* valuep, sb4 value_sz, ub2 dty,
                    void* indp, ub2* alenp, ub2* rcodep,
                    ub4 maxarr_len, ub4* curelep, ub4 mode);

参数

  • stmtp:语句句柄
  • bindp:指向绑定句柄指针的指针
  • errhp:错误句柄
  • placeholder:SQL 占位符
  • placeh_len:SQL 占位符长度
  • valuep:变量指针
  • value_sz:变量的大小
  • dty:数据类型
  • indp:指示器变量的指针
  • alenp:实际大小
  • rcodep:指向列级代码的指针
  • maxarr_len:最大数组长度,未使用
  • curelep:当前数组长度,未使用
  • mode:模式

说明

在 Oracle 中,indp 用于指示列值是否为 NULL,此指针指向 sb2 类型变量,-1 表示 NULL,0 表示非 NULL。alenp 表示列值的实际大小,当取值为 0 时,列值为 NULL。rcodep 用于输出参数。在绑定数组时,valuep、indp、alenp、rcodep 均指向数组,value_sz 为单个变量的大小,maxarr_len 为 0,curelep 为 NULL。

在 XuguDB-OCI 中,对 Oracle 的兼容存在部分问题。列值的实际大小对应 value_sz,而 alenp 未使用。indp 与 Oracle 保持一致。支持数组的绑定,由于 alenp 存在兼容性问题,因此在绑定字符串数组时存在字符串长度无法单个指定的问题。

示例

C
const char* sql = "INSERT INTO tab_test(id, name) VALUES(:id, :name)";
OCIStmtPrepare(stmt, err, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

OCIBind* bind[2];
int id = 13;
char name[20] = "Tom";
sb2 ind[2] = { 0,0 };
OCIBindByName(stmt, &bind[0], err, "id", 2, &id, 4, SQLT_INT, &ind[0], NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIBindByName(stmt, &bind[1], err, "name", 4, name, strlen(name), SQLT_CHR, &ind[1], NULL, NULL, 0, NULL, OCI_DEFAULT);

OCIStmtExecute(ctx, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

OCIStmtExecute

功能

执行已准备的 SQL 语句。

原型

C
sword OCIStmtExecute(OCISvcCtx* svchp, OCIStmt* stmtp, OCIError* errhp,
                     ub4 iters, ub4 rowoff, const OCISnapshot* snap_in,
                     OCISnapshot* snap_out, ub4 mode);

参数

  • svchp:服务上下文句柄
  • stmtp:语句句柄
  • errhp:错误句柄
  • iters:DML 语句执行的次数为 iters
  • rowoff:数组绑定中的数据与此多行执行相关的起始索引,未使用
  • snap_in:可选参数。如果提供,它必须是指向类型为 OCI_DTYPE_SNAP 的快照描述符的指针,未使用
  • snap_out:可选参数。如果提供,它必须是指向类型为 OCI_DTYPE_SNAP 的快照描述符的指针,未使用
  • mode:模式

说明

若 DQL 语句被执行成功,iters 则为获取的数据的行数,相当于在 OCIStmtExecute 中调用了一次 OCIStmtFetch,且为其 nrows 传入了 iters 参数。

若 DML 语句被执行,则此 DML 语句被执行 iters 次。

若 DDL 语句被执行,则此 DDL 语句被执行一次。

若 mode 为 OCI_COMMIT_ON_SUCCESS,在成功调用 execute 后,会提交事务。

示例

C
const char* sql = "SELECT * FROM tab_test";
OCIStmtPrepare(stmt, err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(ctx, stmt, err, 0, 0, NULL, NULL, OCI_DEFAULT);

OCIStmtFetch

功能

从结果集中获取行。

原型

c
sword OCIStmtFetch(OCIStmt* stmtp, OCIError* errhp, ub4 nrows,
                   ub2 orientation, ub4 mode);

参数

  • stmtp:语句句柄
  • errhp:错误句柄
  • nrows:从当前位置获取的行数
  • orientation:方向,仅支持 OCI_FETCH_NEXT
  • mode:仅支持 OCI_DEFAULT

说明

nrows 若大于1,在调用 OCIDefineByPos 时,valuep 等相关参数应传入对应的数组。

示例

C
const char* sql = "SELECT * FROM tab_test";
ret = OCIStmtPrepare(stmt, err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIDefine* def;
int id;
ret = OCIDefineByPos(stmt, &def, err, 1, &id, 4, SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
ret = OCIStmtExecute(ctx, stmt, err, 0, 0, NULL, NULL, OCI_DEFAULT);
while (TRUE) {
    ret = OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
    if(ret != OCI_SUCCESS)
        break;
}

OCIStmtRelease

功能

释放语句句柄。

原型

C
sword OCIStmtRelease(OCIStmt* stmtp, OCIError* errhp, const OraText* key,
                     ub4 key_len, ub4 mode);

参数

  • stmtp:语句句柄
  • errhp:错误句柄
  • key:仅对语句缓存有效,在缓存中此关键字被关联到语句,未使用
  • key_len:仅对语句缓存有效,关键字长度,未使用
  • mode:模式,未使用

示例

C
OCIStmtRelease(stmt, err, NULL, 0, OCI_DEFAULT);

OCILogon

功能

创建登录会话,可简化登录步骤。

原型

C
sword OCILogon(OCIEnv* envhp, OCIError* errhp, OCISvcCtx** svchp,
               const OraText* username, ub4 uname_len,
               const OraText* password, ub4 passwd_len,
               const OraText* dbname, ub4 dbname_len);

参数

  • envhp:环境句柄
  • errhp:错误句柄
  • svchp:服务上下文句柄
  • username:数据库用户名
  • uname_len:数据库用户名长度
  • password:数据库密码
  • passwd_len:数据库密码长度
  • dbname:登录的数据库名,或完整连接串
  • dbname_len:登录的数据库名或连接串长度

说明

参数 dbname 可直接指定登录的数据库名,也可指定所登录数据库的 IP 和端口,如:127.0.0.1:5138/SYSTEM。

示例

C
const char* username = "SYSDBA";
const char* pwd = "SYSDBA";
const char* db = "SYSTEM";
ret = OCILogon(env, err, &ctx,
                (OraText*)username, strlen(username),
                (OraText*)pwd, strlen(pwd),
                (OraText*)db, strlen(db));

OCILogoff

功能

释放一个由 OCILogon 或 OCILogon2 创建的会话。

原型

c
sword OCILogoff(OCISvcCtx* svchp, OCIError* errhp);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄

示例

C
OCILogoff(ctx, err);

OCITransStart

功能

开启事务。

原型

C
sword OCITransStart(OCISvcCtx* svchp, OCIError* errhp,
                    uword timeout, ub4 flags);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • timeout:超时时间,未使用
  • flags:指定是否开启一个新事务或继续使用已存在的事务,未使用

示例

C
OCITransStart(ctx, err, 0, OCI_TRANS_NEW);

OCITransCommit

功能

提交服务上下文句柄关联的事务。

原型

C
sword OCITransCommit(OCISvcCtx* svchp, OCIError* errhp, ub4 flags);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • flags:在全局事务中标志单一提交选项,未使用

示例

C
OCITransCommit(ctx, err, OCI_DEFAULT);

OCITransRollback

功能

回滚当前事务。

原型

C
sword OCITransRollback(OCISvcCtx* svchp, OCIError* errhp, ub4 flags);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • flags:仅支持 OCI_DEFAULT,未使用

示例

C
OCITransRollback(ctx, err, OCI_DEFAULT);

OCITransDetach

功能

断开事务。仅做兼容,无实现。

原型

C
sword OCITransDetach(OCISvcCtx* svchp, OCIError* errhp, ub4 flags);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • flags:仅支持 OCI_DEFAULT

示例

C
OCITransDetach(ctx, err, OCI_DEFAULT);

OCITerminate

功能

从共享内存中断开进程并释放共享内存。仅做兼容,无实现。

原型

c
sword OCITerminate(ub4 mode);

参数

  • mode:仅有效的模式为 OCI_DEFAULT

示例

C
OCITerminate(OCI_DEFAULT);

OCIDescriptorAlloc

功能

分配描述符。

原型

C
sword OCIDescriptorAlloc(const void* parenth, void** descpp,
      const ub4 type, const size_t xtramem_sz, void** usrmempp);

参数

  • parenth:环境句柄
  • descpp:LOB 定位符地址
  • type:指定分配描述符还是 LOB 定位符
  • xtramem_sz:指定描述符生命周期中分配的用户内存数
  • usrmempp:返回此函数调用分配的用户内存指针

示例

C
OCILobLocator* lob;
OCIDescriptorAlloc(env, &lob, OCI_DTYPE_LOB, 0, NULL);

OCIDescriptorFree

功能

释放描述符。

原型

C
sword OCIDescriptorFree(void *descp, ub4 type);

参数

  • descp:LOB 定位符地址
  • type:指定分配描述符还是 LOB 定位符

示例

C
OCILobLocator* lob;
OCIDescriptorAlloc(env, &lob, OCI_DTYPE_LOB, 0, NULL);
OCIDescriptorFree(lob, OCI_DTYPE_LOB);

OCILobRead

功能

从 LOB 中读取一个数据片段。

原型

C
sword OCILobRead(OCISvcCtx* svchp, OCIError* errhp, OCILobLocator* locp,
                 ub4* amtp, ub4 offset, void* bufp, ub4 bufl, void* ctxp,
                 OCICallbackLobRead cbfp, ub2 csid, ub1 csfrm);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • locp:Lob 定位符
  • amtp:实际读取的字节数
  • offset:偏移量,1为不偏移,仅第一次调用有效,不可小于1
  • bufp:接收数据的缓冲区
  • bufl:缓冲区大小
  • ctxp:回调函数上下文
  • cbfp:为每一个片段注册的回调函数
  • csid:缓存数据的字符集 ID
  • csfrm:缓存数据的字符集形式

说明

回调函数 cbfp 的原型为 sb4 OCICallbackLobRead(void* ctxp, const void* bufp, ub4 len, ub1 piece) 其中

  • ctxp 为 OCILobRead 参数 ctxp 的传入值
  • bufp 为 OCILobRead 参数 bufp 的传入值,且已填充数据
  • len 为当次读取的数据量,小于等于 bufl
  • piece 为 OCI_FRIST_PIECE、OCI_NEXT_PIECE、OCI_LAST_PIECE

回调函数的返回值必须为 OCI_CONTINUE,否则 OCILobRead 立即终止,且返回 OCI_ERROR。

OCILobRead 返回值:读取完毕返回 OCI_SUCCESS,未读取完毕返回 OCI_NEED_DATA

示例

C
const char* sql = "SELECT lob FROM tab_test WHERE id = 1";
OCIStmtPrepare(stmt, err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIDefineByPos(stmt, &def, err, 1, &lob, 0, SQLT_BLOB, NULL, NULL, NULL, OCI_DEFAULT);
OCIStmtExecute(ctx, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

ub4 amt;
char buf[1024];
FILE* fp = fopen("lob.png", "wb");

do 
{
    ret = OCILobRead(ctx, err, lob, &amt, 1, buf, 1024, NULL, NULL, 0, SQLCS_IMPLICIT);
    fwrite(buf, 1, amt, fp);
} while (ret == OCI_NEED_DATA);

fclose(fp);

OCILobWrite

功能

将缓冲区的数据写入 LOB。

原型

c
sword OCILobWrite(OCISvcCtx* svchp, OCIError* errhp, OCILobLocator* locp,
                  ub4* amtp, ub4 offset, void* bufp, ub4 buflen,
                  ub1 piece, void* ctxp, OCICallbackLobWrite cbfp,
                  ub2 csid, ub1 csfrm);

参数

  • svchp:服务上下文句柄
  • errhp:错误句柄
  • locp:Lob 定位符
  • amtp:总的字节数或字符数
  • offset:从开始位置的绝对偏移量,1 为不偏移
  • bufp:数据缓冲区
  • buflen:缓冲区大小
  • piece:缓冲区的哪一片,取值为:OCI_ONE_PIECE、OCI_FIRST_PIECE、OCI_NEXT_PIECE、OCI_LAST_PIECE
  • ctxp:回调函数的上下文
  • cbfp:为每一片的写入注册回调函数
  • csid:缓冲区中数据的字符集 ID
  • csfrm:缓冲区中数据的字符集形式

说明

不分片(OCI_ONE_PIECE)

amtp 为实际写入的字节数,其值需小于等于 buflen。当 offset > 1 时,写入的总字节数为 amtp + offset,偏移的部分补 0。

分片(OCI_FIRST_PIECE、OCIE_NEXT_PIECE、OCIE_LAST_PIECE)

写入 OCI_FIRST_PIECE 时,*amtp 的值为需写入的字节总数,offset 偏移前的数据以 0 填充。若 offset 大于 1,则实际写入的字节数为 *amtp + offset。

写入 OCI_NEXT_PIECE 和 OCI_LAST_PIECE 时,amtp 返回当次写入的字节数,offset 被忽略但其值需大于0。

写入 OCI_NEXT_PIECE 时,写入的字节总数不可大于等于写入 OCI_FIRST_PIECE 时指定的 *amtp 的值。

写入 OCI_LAST_PIECE 时,写入的字节总数不可少于写入 OCI_FIRST_PIECE 时指定的 *amtp 的值。若此时写入的数据大于写入 OCI_FIRST_PIECE 时指定的 *amtp 的值时,将发生截断。

可以不写入 OCI_NEXT_PIECE,但必须写入 OCI_FIRST_PIECE 和 OCI_LAST_PIECE。

回调函数

函数原型为:sword CallbackLobWrite(void* ctxp, void* bufp, ub4* lenp, ub1* piece)

  • ctxp:为 OCILobWrite 参数 ctxp 的传入值
  • bufp:为 OCILobWrite 参数 bufp 的传入值
  • lenp:指向此次写入的字节数的指针
  • piece:指向此次写入的片信息的指针

调用 OCILobWrite 时,*amtp 的值应为需写入的字节总数,bufp 中的数据为第一片(OCI_FIRST_PIECE)数据。

回调函数中 *piece 的有效取值为 OCI_NEXT_PIECE 和 OCI_LAST_PIECE。

回调函数应返回 OCI_CONTINUE,否则 OCILobWrite 将退出。

示例

C
const char* sql = "INSERT INTO tab_test (img) VALUES(:img)";
ret = OCIStmtPrepare(stmt, err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

OCIBind* bind;
ret = OCIBindByPos(stmt, &bind, err, 1, &lob, sizeof(lob), SQLT_BLOB, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
ret = OCILobCreateTemporary(ctx, err, lob, OCI_DEFAULT, SQLCS_IMPLICIT, OCI_TEMP_BLOB, FALSE, OCI_DURATION_SESSION);

FILE* fp = fopen(blobFile, "rb");
fseek(fp, 0, SEEK_END);
ub4 blobSize = ftell(fp);
fseek(fp, 0, SEEK_SET);

char* buf = (char*)malloc(blobSize);
fread(buf, 1, blobSize, fp);
fclose(fp);

ret = OCILobWrite(ctx, err, lob, &blobSize, 1, buf, blobSize, OCI_ONE_PIECE, NULL, NULL, OCI_DEFAULT, SQLCS_IMPLICIT);
free(buf);

ret = OCIStmtExecute(ctx, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

OCIStmtSetPieceInfo

功能

为分段操作设置分段信息。

原型

c
sword OCIStmtSetPieceInfo(void* hndlp, ub4 type, OCIError* errhp,
                          const void* bufp, ub4* alenp, ub1 piece,
                          const void* indp, ub2* rcodep);

参数

  • hndlp:绑定或定义句柄
  • type:句柄类型
  • errhp:错误句柄
  • bufp:数据缓冲区
  • alenp:缓冲区大小
  • piece:片段
  • indp:指向指示器结构体的指针
  • rcodep:返回码

说明

分片写入在绑定时,可使用 OCIBindByPos 和 OCIBindByName 绑定参数,绑定时需指定序号或者参数名、value_sz、dty,value_sz 指定数据总大小。OCIStmtSetPieceInfo 的总数据大小不可大于在绑定时 value_sz 指定的值,但可小于其值。绑定的模式为:OCI_DATA_AT_EXEC,绑定完成后,需执行一次OCIStmtExecute,其返回值为OCI_NEED_DATA。然后多次调用 OCIStmtSetPieceInfo 和 OCIStmtExecute。

分片读取在绑定时需指定 position、value_sz、dty 和 mode,value_sz 为读取数据的总量其值可大于实际大小,mode 需指定为 OCI_DYNAMIC_FETCH。调用 OCIStmtExecute 其返回值为 OCI_NEED_DATA。使用 OCIStmtSetPieceInfo 传入指向 OCIDefine 的指针,指定数据缓冲区和读取的数据量,调用 OCIStmtFetch 获取数据片段,循环这两个步骤直至取完。若当前行所有的分片数据全部取完,OCIStmtFetch 返回 OCI_SUCCESS,否则返回 OCI_NEED_DATA。若有多个分片字段,无法通过 OCIStmtFetch 的返回值判断当前字段是否取完。可通过 *alenp 的值是否小于原始值判断是否取完当前字段,如果刚好取完,则也无法判断当前字段是否取完。此接口应配合 OCIStmtGetPieceInfo接口一起使用。

示例

C
sword ret;
const char* sql = "SELECT lob FROM tab_test WHERE id = 1";
ret = OCIStmtPrepare(stmt, err, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

int id;
OCIDefine* def;
ret = OCIDefineByPos(stmt, &def, err, 1, NULL, 10000, SQLT_BIN, NULL, NULL, NULL, OCI_DYNAMIC_FETCH);
ret = OCIStmtExecute(ctx, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

char buf[1024];
ub4 alen = 1024;
int i = 0;
while (ret == OCI_NEED_DATA)
{
    ret = OCIStmtSetPieceInfo(def, OCI_HTYPE_DEFINE, err, buf, &alen, OCI_NEXT_PIECE, NULL, NULL);
    ret = OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
    printf("第%d\n", ++i);
}

OCIStmtGetPieceInfo

功能

在分片操作中返回分片信息。

原型

c
sword OCIStmtGetPieceInfo(const OCIStmt *stmtp, OCIError *errhp,
                          void **hndlpp, ub4 *typep, ub1 *in_outp, ub4 *iterp, 
                          ub4 *idxp, ub1 *piecep );

参数

  • stmtp:当执行 execute 时返回 OCI_NEED_DATA 的语句句柄
  • errhp:错误句柄
  • hndlpp:返回一个指向 bind 或 define 的句柄指针
  • typep:返回句柄的类型:OCI_HTYPE_BIND 或 OCI_HTYPE_DEFINE
  • in_outp:返回输入输出类型:OCI_PARAM_IN 或 OCI_PARAM_OUT
  • iterp:返回多行操作的行数
  • idxp:PL/SQL 数组绑定操作的数组元素的索引
  • piecep:返回如下值:OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or OCI_LAST_PIECE

示例

C
const char* sql = "INSERT INTO tab_test (txt1, txt2, txt3) VALUES(:txt1, :txt2, :txt3)";
ret = OCIStmtPrepare(stmt, err, (OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

OCIBind* bind;
ret = OCIBindByPos(stmt, &bind, err, 1, NULL, 30, SQLT_CHR, NULL, NULL, NULL, 0, NULL, OCI_DATA_AT_EXEC);
ret = OCIBindByPos(stmt, &bind, err, 2, NULL, 30, SQLT_CHR, NULL, NULL, NULL, 0, NULL, OCI_DATA_AT_EXEC);
ret = OCIBindByPos(stmt, &bind, err, 3, NULL, 30, SQLT_CHR, NULL, NULL, NULL, 0, NULL, OCI_DATA_AT_EXEC);
ret = OCIStmtExecute(ctx, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

const char* data = "123456789012345678901234567890";
const char* p;
const char* end = data + 20;
ub4 alen = 10;

void* hndl;
while (ret == OCI_NEED_DATA)
{
  while (TRUE)
  {
    ret = OCIStmtGetPieceInfo(stmt, err, (void**)&hndl, &type, &inout, &iter, &idx, &piece);
    if (piece == OCI_FIRST_PIECE)
      p = data;
    else if (piece == OCI_NEXT_PIECE)
      p += 10;

    if (p == end)
      piece = OCI_LAST_PIECE;

    ret = OCIStmtSetPieceInfo(hndl, type, err, p, &alen, piece, NULL, NULL);
    ret = OCIStmtExecute(ctx, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

    if (p == end)
      break;
  }
}

ret = OCITransCommit(ctx, err, OCI_DEFAULT);

OCIServerVersion

功能

返回数据库版本字符串。

原型

c
sword OCIServerVersion(void* hndlp, OCIError* errhp, OraText* bufp,
                       ub4 bufsz, ub1 hndltype);

参数

  • hndlp:服务上下文句柄
  • errhp:错误句柄
  • bufp:返回版本信息的字符缓冲区
  • bufsz:缓冲区大小
  • hndltype:句柄类型

说明

在 Oracle 中,句柄类型为 OCI_HTYPE_SERVER 或 OCI_HTYPE_SVCCTX。XuguDB-OCI 不支持从服务器句柄查询服务端版本,仅支持在成功登录数据库后通过上下文句柄获取服务端版本。

示例

C
char version[30];
ret = OCIServerVersion(ctx, err, version, 30, OCI_HTYPE_SVCCTX);

OCIDateGetDate

功能

从 Oracle date 中获取年、月和日。

原型

c
void OCIDateGetDate(const OCIDate* date, sb2* year, ub1* month, ub1* day);

参数

  • date:Oracle 日期
  • year:返回年
  • month:返回月
  • day:返回日

示例

C
sb2 year;
ub1 month;
ub1 day;
OCIDate date;
OCIDateSetDate(&date, 2021, 11, 1);
OCIDateGetDate(&date, &year, &month, &day);

OCIDateGetTime

功能

从 Oracle date 中获取时间。

原型

c
void OCIDateGetTime(const OCIDate* date, ub1* hour, ub1* min, ub1* sec);

参数

  • date:Oracle 日期
  • hour:返回小时
  • min:返回分钟
  • sec:返回秒

示例

C
ub1 hour;
ub1 minute;
ub1 second;
OCIDate date;
OCIDateSetTime(&date, 14, 30, 20);
OCIDateGetTime(&date, &hour, &minute, &second);

OCIDateSetDate

功能

为 Oracle date 设置日期值。

原型

c
void OCIDateSetDate(OCIDate* date, sb2 year, ub1 month, ub1 day);

参数

  • date:Oracle 日期
  • year:年
  • month:月
  • day:日

示例

C
OCIDate date;
OCIDateSetDate(&date, 2021, 11, 1);

OCIDateSetTime

功能

为 Oracle date 设置时间值。

原型

c
void OCIDateSetTime(OCIDate* date, ub1 hour, ub1 min, ub1 sec);

参数

  • date:Oracle 日期
  • hour:小时
  • min:分钟
  • sec:秒

示例

C
OCIDate date;
OCIDateSetTime(&date, 14, 30, 20);

OCIDateAddDays

功能

在给定的日期加/减天数。

原型

c
sword OCIDateAddDays(OCIError* err, const OCIDate* date, sb4 num_days,
                     OCIDate* result);

参数

  • err:错误句柄
  • date:待加/减的日期
  • num_days:加/减的天数,负数表示减
  • result:结果日期

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

示例

C
OCIDate date;
OCIDateSetDate(&date, 2021, 11, 1);
OCIDateSetTime(&date, 14, 30, 20);
OCIDate res;
OCIDateAddDays(NULL, &date, 10, &res);

OCIDateAddMonths

功能

在给定的日期上加/减月数。

原型

c
sword OCIDateAddMonths(OCIError* err, const OCIDate* date, sb4 num_months, OCIDate* result);

参数

  • err:错误句柄
  • date:待加/减的日期
  • num_months:加/减的月数,负数表示减
  • result:结果日期

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

示例

C
OCIDate date;
OCIDateSetDate(&date, 2021, 11, 1);
OCIDateSetTime(&date, 14, 30, 20);
OCIDate res;
OCIDateAddMonths(NULL, &date, 10, &res);

OCIDateAssign

功能

进行日期分配。

原型

c
sword OCIDateAssign(OCIError* err, const OCIDate* from, OCIDate* to);

参数

  • err:错误句柄
  • from:被分配的日期
  • to:分配的目标

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

示例

C
OCIDate date;
OCIDateSetDate(&date, 2021, 11, 1);
OCIDateSetTime(&date, 14, 30, 20);

OCIDate to;
OCIDateAssign(NULL, &date, &to);

OCIDateCompare

功能

比较两个日期的相等性。

原型

c
sword OCIDateCompare(OCIError* err, const OCIDate* date1,
                     const OCIDate* date2, sword* result);

参数

  • err:错误句柄
  • date1:待比较的日期
  • date2:待比较的日期
  • result:比较结果,date1 < date2:-1;date1 = date2:0;date1 > date2:1

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

示例

C
OCIDate d1, d2;
OCIDateSetDate(&d1, 2021, 11, 10);
OCIDateSetTime(&d1, 14, 30, 20);
OCIDateSetDate(&d2, 2021, 11, 11);
OCIDateSetTime(&d2, 14, 30, 20);
sword res;
OCIDateCompare(NULL, &d1, &d2, &res);

OCIDateLastDay

功能

获取指定日期所在月的最后一天的日期。

原型

c
sword OCIDateLastDay(OCIError* err, const OCIDate* date,
                     OCIDate* last_day);

参数

  • err:错误句柄
  • date:日期
  • last_day:最后一天的日期

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

示例

C
OCIDate d1, d2;
OCIDateSetDate(&d1, 2021, 11, 11);
OCIDateSetTime(&d1, 14, 30, 20);
OCIDateLastDay(NULL, &d1, &d2);

OCIDateSysDate

功能

获取客户端当前的系统日期和时间。

原型

c
sword OCIDateSysDate(OCIError* err, OCIDate* sys_date);

参数

  • err:错误句柄
  • sys_date:当前日期时间

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

示例

C
OCIDate date;
ret = OCIDateSysDate(NULL, &date);

OCIDateToText

功能

将日期类型转为日期字符串。

原型

c
sword OCIDateToText(OCIError* err, const OCIDate* date,
                    const oratext* fmt, ub1 fmt_length,
                    const oratext* lang_name, ub4 lang_length,
                    ub4* buf_size, oratext* buf);

参数

  • err:错误句柄
  • date:日期
  • fmt:日期格式
  • fmt_length:日期格式长度
  • lang_name:指定语言,未使用
  • lang_length:语言的长度,未使用
  • buf_size:缓冲区大小
  • buf:存放转换后的日期字符串的缓冲区

说明

在 Oracle 中,错误句柄必须传入。在 XuguDB-OCI 中,错误句柄可传入 NULL。

日期格式:

    • yy 两位年 显示值:22
    • yyy 三位年 显示值:022
    • yyyy 四位年 显示值:2022
    • mm 两位月 显示值:01
    • dd 两位日 显示值:01
    • hh 12进制 显示值:01
    • hh24 24进制 显示值:13
    • mi 两位分 显示值:15
    • ss 两位秒 显示值:45

日期格式字符串可传入 NULL,默认的格式串为 yyyy-mm-dd hh24:mi:ss。

示例

C
OCIDate date;
OCIDateSetDate(&date, 2022, 7, 1);
OCIDateSetTime(&date, 14, 30, 20);
char buf[30];
ub4 len;
const char* fmt = "yyyy-mm-dd hh24:mi:ss";
OCIDateToText(NULL, &date, fmt, strlen(fmt), NULL, 0, &len, buf);