找回密码
 立即注册
首页 业界区 业界 OCI编程高级篇(十三) 直接路径装载分配句柄 ...

OCI编程高级篇(十三) 直接路径装载分配句柄

玛凶 2025-8-14 20:12:30
访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。
直接路径装载最少分配三个句柄,第一个是直接路径上下文句柄OCIDirPathCtx,这个句柄从父句柄环境句柄envhp分配,每一个要装载的对象都要有一个OCIDirPathCtx,可以分配多个句柄,也可以多个对象共用一个句柄。以OCIDirPathCtx为父句柄,可以分配另外两个句柄,一个是直接路径字段数组句柄OCIDirPathColArray,用于设置表的字段信息和字段数据。另一个是直接路径流句柄OCIDirPathStream,用于把字段数组转换成数据流。
我们之前创建过一个表,用于前面的OCI代码演示,建表语句是CREATE TABLE test_tab (ID NUMBER, NAME CHAR(30), ADDR VARCHAR2(200))。我们还以这个表为例,使用直接路径装载插入数据,看看开始分配句柄和设置句柄属性的过程。表的名称为test_tab,表的schema为scott,下面是代码演示。
 
  1. OCIEnv       *envhp = NULL;
  2. OCIError     *errhp = NULL;
  3. OCIServer    *svrhp = NULL;
  4. OCISession   *usrhp = NULL;
  5. OCISvcCtx    *svchp = NULL;
  6. int dp_load(void){
  7.     ub4                  buf_sz;
  8.     ub4                  ncol;
  9.     OCIDirPathCtx        *dpctx;
  10.     OCIDirPathColArray   *dpca;
  11.     OCIDirPathStream     *dpstr;
  12.     /* 分配直接路径上下文句柄,父句柄是envhp */
  13.     if (check_oci_error(errhp,
  14.         OCIHandleAlloc((void *)envhp, (void **)&dpctx,
  15.             OCI_HTYPE_DIRPATH_CTX, 0, (void **)NULL)
  16.         ) < 0)
  17.         return (-1);
  18.     /* 分配直接路径字段数组句柄,父句柄是dpctx */
  19.     if (check_oci_error(errhp,
  20.         OCIHandleAlloc((void *)dpctx, (void **)&dpca,
  21.             OCI_HTYPE_DIRPATH_COLUMN_ARRAY, 0, (void **)NULL)
  22.         ) < 0)
  23.         return (-1);
  24.     /* 分配直接路径流句柄,父句柄是dpctx */
  25.     if (check_oci_error(errhp,
  26.         OCIHandleAlloc((void *)dpctx, (void **)&dpstr,
  27.             OCI_HTYPE_DIRPATH_STREAM, 0, (void **)NULL)
  28.         ) < 0)
  29.         return (-1);
  30.     /* 设置表的schema,在上下文句柄中设置 */
  31.     if (check_oci_error(errhp,
  32.         OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
  33.             (void *)"scott", strlen("scott"),
  34.             (ub4)OCI_ATTR_SCHEMA_NAME, errhp)
  35.         ) < 0)
  36.         return (-1);
  37.     /* 设置表名称,在上下文句柄中设置 */
  38.     if (check_oci_error(errhp,
  39.         OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
  40.             (void *)"test_tab", strlen("test_tab"),
  41.             (ub4)OCI_ATTR_NAME, errhp)
  42.         ) < 0)
  43.         return (-1);
  44.     /* 设置转换缓冲区的大小为2M */
  45.     buf_sz = 2 * 1024 * 1024;
  46.     if (check_oci_error(errhp,
  47.         OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
  48.             (void *)&buf_sz, 0,
  49.             (ub4)OCI_ATTR_BUF_SIZE, errhp)
  50.         ) < 0)
  51.         return (-1);
  52.     /* 设置表的字段个数 */
  53.     ncol = 3;
  54.     if (check_oci_error(errhp,
  55.         OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
  56.             (void *)&ncol, 0,
  57.             (ub4)OCI_ATTR_NUM_COLS, errhp)
  58.         ) < 0)
  59.         return (-1);
  60.     /* 后面需要设置表的字段信息了,我们在下一节中继续 */
  61.     /* 未完,待续 ... */
  62.     return (0);
  63. }
复制代码
 
在上面的例子中我们分配了三个句柄,并且在代表对象的直接路径上下文中设置了表的属主,表的名称,表的字段个数,转换缓冲区的大小等属性。
在下一节中我们看看怎样设置表的字段属性和字段其他信息,字段的设置有点复杂,我们专门用一节来讲清楚。
 

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册