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

直接路径装载最少分配三个句柄,第一个是直接路径上下文句柄OCIDirPathCtx,这个句柄从父句柄环境句柄envhp分配,每一个要装载的对象都要有一个OCIDirPathCtx,可以分配多个句柄,也可以多个对象共用一个句柄。以OCIDirPathCtx为父句柄,可以分配另外两个句柄,一个是直接路径字段数组句柄OCIDirPathColArray,用于设置表的字段信息和字段数据。另一个是直接路径流句柄OCIDirPathStream,用于把字段数组转换成数据流。

我们之前创建过一个表,用于前面的OCI代码演示,建表语句是CREATE TABLE test_tab (ID NUMBER, NAME CHAR(30), ADDR VARCHAR2(200))。我们还以这个表为例,使用直接路径装载插入数据,看看开始分配句柄和设置句柄属性的过程。表的名称为test_tab,表的schema为scott,下面是代码演示。

OCIEnv		*envhp = NULL;
OCIError	*errhp = NULL;
OCIServer	*svrhp = NULL;
OCISession	*usrhp = NULL;
OCISvcCtx	*svchp = NULL;


int dp_load(void)
{
    ub4                  buf_sz;
    ub4                  ncol;
    OCIDirPathCtx        *dpctx;
    OCIDirPathColArray   *dpca;
    OCIDirPathStream     *dpstr;


    /* 分配直接路径上下文句柄,父句柄是envhp */
    if (check_oci_error(errhp,
        OCIHandleAlloc((void *)envhp, (void **)&dpctx,
            OCI_HTYPE_DIRPATH_CTX, 0, (void **)NULL)
        ) < 0)
        return (-1);

    /* 分配直接路径字段数组句柄,父句柄是dpctx */
    if (check_oci_error(errhp,
        OCIHandleAlloc((void *)dpctx, (void **)&dpca,
            OCI_HTYPE_DIRPATH_COLUMN_ARRAY, 0, (void **)NULL)
        ) < 0)
        return (-1);

    /* 分配直接路径流句柄,父句柄是dpctx */
    if (check_oci_error(errhp,
        OCIHandleAlloc((void *)dpctx, (void **)&dpstr,
            OCI_HTYPE_DIRPATH_STREAM, 0, (void **)NULL)
        ) < 0)
        return (-1);

    /* 设置表的schema,在上下文句柄中设置 */
    if (check_oci_error(errhp,
        OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
            (void *)"scott", strlen("scott"),
            (ub4)OCI_ATTR_SCHEMA_NAME, errhp)
        ) < 0)
        return (-1);

    /* 设置表名称,在上下文句柄中设置 */
    if (check_oci_error(errhp,
        OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
            (void *)"test_tab", strlen("test_tab"),
            (ub4)OCI_ATTR_NAME, errhp)
        ) < 0)
        return (-1);

    /* 设置转换缓冲区的大小为2M */
    buf_sz = 2 * 1024 * 1024;
    if (check_oci_error(errhp,
        OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
            (void *)&buf_sz, 0,
            (ub4)OCI_ATTR_BUF_SIZE, errhp)
        ) < 0)
        return (-1);

    /* 设置表的字段个数 */
    ncol = 3;
    if (check_oci_error(errhp,
        OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX,
            (void *)&ncol, 0,
            (ub4)OCI_ATTR_NUM_COLS, errhp)
        ) < 0)
        return (-1);

    /* 后面需要设置表的字段信息了,我们在下一节中继续 */
    /* 未完,待续 ... */

    return (0);
}

​

在上面的例子中我们分配了三个句柄,并且在代表对象的直接路径上下文中设置了表的属主,表的名称,表的字段个数,转换缓冲区的大小等属性。

在下一节中我们看看怎样设置表的字段属性和字段其他信息,字段的设置有点复杂,我们专门用一节来讲清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值