VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

错误句柄处理接口

错误句柄处理接口是指,当OCI的函数出现错误时,能够通过错误句柄的接口OCIErrorGet获取错误码和错误信息。在此需要分清三个概念:

  • OCI返回码:是OCI接口返回值,包括如OCI_SUCCESS、OCI_ERROR等。
  • OCI错误码:是OCI接口返回码错误时,通过OCIErrorGet的errcodep参数获取。
  • OCI错误信息:是OCI接口返回码错误时,通过OCIErrorGet的bufp参数获取。

OCI返回码

OCI的返回码数量有限,如下列出了所有返回码。

OCI 返回码 描述
OCI_SUCCESS 0 The function completed successfully.
OCI_SUCCESS_WITH_INFO 1 The function completed successfully; a call to OCIErrorGet() returns additional diagnostic information. This may include warnings.
OCI_NO_DATA 100 The function completed, and there is no further data.
OCI_ERROR -1 The function failed; a call to OCIErrorGet() returns additional information.
OCI_INVALID_HANDLE -2 An invalid handle was passed as a parameter or a user callback was passed an invalid handle or invalid context. No further diagnostics are available.
OCI_NEED_DATA 99 The application must provide runtime data.
OCI_STILL_EXECUTING -3123 The service context was established in nonblocking mode, and the current operation could not be completed immediately. The operation must be called again to complete. OCIErrorGet() returns ORA-03123 as the error code.
OCI_CONTINUE -24200 This code is returned only from a callback function. It indicates that the callback function wants the OCI library to resume its normal processing.
OCI_ROWCBK_DONE -24201 This code is returned only from a callback function. It indicates that the callback function is done with the user row callback.

OCI错误码

OCI错误码是一个sb4类型数据,其中和错误信息一一对应,通过错误可以查找到错误信息。

表1 错误码映射列表

错误码 描述
90000 数组越界param invalid position
90001 绑定参数失败OCI2ODBC_Bind_Mapping not suppot
90002 绑定参数指针错误bindp odbcbpp error
90003 连接用户名或者密码错误dblink or username or password error
90004 OCI官方文档中提到若pos超过字段数,会返回ORA-24334,这里未处理错误码 out of range
90005 分片操作不可用的类型 Is not valid Type
90006 服务上下文句柄为空OCIStmtPrepare svchp is NULL
90007 bad
90008 错误的数据量或者模式Error nrows or orientation or mode
90009 SQLNumParams前后判断前面分析不正确Error binds params
90010 LOB结构体里没有申请内存 null pointer
90011 OCIClose只支持OCI_DTYPE_FILE和OCI_DTYPE_LOB OCILobClose not suppports
90012 Lob没有打开 Lob has not opened
90013 OCI_DTYPE_FILE has not supported to trim
90014 OCILobTrim only supports OCI_DTYPE_LOB
90015 invaile username len or password len or dbname len
90016 Cannot bind keywords
90017 invaild fmt or fmt_length
90018 buffer or buf_size error
90019 invaild out pointer
90020 invalid input param
90021 Temporarily only provide compatibility interface
90022 Please check username, username length, password, password length, old password, old password length.
90023 invalid time value
90024 invalid locp->defnp point
90025 OCILobRead :actul data length is larger than bufl
90026 invaild the length indicator returned by the SQLGetData
91000 无法映射的错误

OCI错误信息

OCI错误信息一个无符号字符数组,包含了OCI接口出错的原因。

OCIErrorGet

功能描述

返回错误消息和 Oracle 数据库错误代码。

功能说明

OCIErrorGet在OCI的函数返回 OCI_ERROR 或 OCI_SUCCESS_WITH_INFO 的 OCI 调用之后调用 OCIErrorGet(),否则 OCIErrorGet() 可能会发现来自某些早期 OCI 调用的错误消息导致错误。 为避免此问题,仅应在返回 OCI_ERROR 或 OCI_SUCCESS_WITH_INFO 的 OCI 调用之后调用 OCIErrorGet()。

错误句柄最初是通过调用 OCIHandleAlloc() 分配的。

接口信息

函数/过程

OCIErrorGet的语法如下:

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

参数解释如下:

  • Hndlp(IN):通常是错误句柄或环境句柄( OCIEnvCreate()、OCIHandleAlloc()上的错误)。
  • recordno(IN):指示应用程序从中寻找信息的状态记录。 从 1 开始。
  • sqlstate(OUT):版本 8.x 或更高版本不支持。
  • errcodep(OUT):返回的错误代码。
  • bufp(OUT):返回的错误消息文本。
  • bufsiz(IN):为错误消息提供的缓冲区大小,以字节数为单位。 如果错误消息长度大于 bufsiz,则在 bufp 中返回截断的错误消息文本。

    • 如果 type 设置为 OCI_HTYPE_ERROR,则 OCIErrorGet() 截断期间的返回码为 OCI_ERROR。 然后客户端可以指定更大的缓冲区并再次调用 OCIErrorGet()。
    • 如果 bufsiz 足以容纳整个消息文本并且可以成功地将消息复制到 bufp,则 OCIErrorGet() 的返回码是 OCI_SUCCESS。
    • 使用以下常量之一定义错误消息缓冲区长度,用户可以在其中从 OCIErrorGet()获取返回的消息:

      # define OCI_ERROR_MAXMSG_SIZE 1024 /* max size of an error message */
      # define OCI_ERROR_MAXMSG_SIZE2 3072 /* new length max size of an error message */
      
  • type(IN):句柄的类型(OCI_HTYPE_ERROR 或 OCI_HTYPE_ENV)。

其他说明