访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

创建OCI环境

在编写OCI程序的第一步就是创建OCI环境,然后分配需要的句柄,下面介绍创建OCI环境的函数。这是OCI程序第一个要调用的函数,名字叫做OCIEnvCreate()。看一下它的函数原型和参数。

sword OCIEnvCreate ( OCIEnv **envhpp,
    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),
    size_t        xtramemsz,
    void           **usrmempp );

envhpp是一个输出参数,是一个指针的指针,为了要把创建的环境句柄带回来。后面的函数会用到这个句柄。

mode是一个输入参数,指示创建OCI环境的模式。有几个主要的模式介绍一下,一般用到的是缺省模式OCI_DEFAULT,大部分程序用这个模式就够了。如果使用多线程调用OCI函数,那么就要用到线程模式OCI_THREADED,这样可以保证每个线程都有一份环境内存,不相互干扰,否则线程之间互相修改共享的环境内存,会造成coredump。如果使用OCI中的对象操作函数,就要用到OCI_OBJECT模式。

ctxp是一个输入参数,指示用户定义的上下文指针,给回调函数用的,一般赋值为NULL就可以了。

malocfp是一个输入参数,是一个函数指针,是用户定义的分配内存的函数,类似C语言中的malloc()函数,一般赋值为NULL。

ralocfp是一个输入参数,是一个函数指针,是用户定义的再分配内存的函数,类似C语言中的realloc()函数,一般赋值为NULL。

mfreefp是一个输入参数,是一个函数指针,是用户定义的释放内存的函数,类似C语言中的free()函数,一般赋值为NULL。由于创建OCI环境变量需要分配一定大小的内存,分配过程中就会用到内存分配函数,上面的三个函数指针就是为分配内存和释放内存准备的,让用户可以自己分配和释放内存,如果没有用户自己定义的函数,那么都赋值为NULL,创建OCI环境时就使用系统自己的分配和释放内存的函数。

xtramemsz是一个输入参数,指示额外分配内存的大小,这个内存可以给用户使用,生命周期与OCI环境的生存期一样长,在释放环境内存时才一起释放掉。一般不用这个内存,可以赋值为0。

usrmempp是一个输出参数,带回分配的用户内存的指针。这个参数与上一个参数是相关的,如果上一个参数大于0,那么必须赋值把分配的用户内存指针带回来,如果上个参数为0,这里赋值为NULL就可以了。

OCIEnvNlsCreate()的返回值是一个sword类型的整数,实际上就是一个有符号的整数。所有的OCI函数返回值都是sword整数,绝大多数的时候返回值是OCI_SUCCESS或OCI_ERROR,表示函数执行成功或出错,特定的函数还会返回其他值,后面遇到时再介绍。

看一个实际的例子。

OCIEnv    *envhp = NULL;

sword       rc;

rc = OCIEnvCreate(
        &envhp,                        /* envhpp */
        OCI_DEFAULT,            /* mode */
        (void *)NULL,               /* ctxp */
        NULL,
        NULL,
        NULL,
        (size_t)0,
        (void **)NULL
);

if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIEnvCreate() - allocate OCI env handle error !\n");
        return (-1);
}

这里返回的envhp就是创建的OCI环境变量指针。

分配句柄

创建完OCI环境之后,马上就要分配必须的句柄才能连接到数据库,分配句柄的函数叫做OCIHandleAlloc()。看一下它的原型和参数。

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

parenth是一个输入参数,表示被分配句柄的父句柄指针,一般会是OCI环境句柄。

hndlpp是一个输出参数,带回被分配的句柄指针。

type是一个输入参数,指示分配句柄的类型。句柄类型有很多,在后面用到时再一一介绍。

xtramem_sz是输入参数,指示额外分配的跟句柄关联的用户内存大小,与创建OCI环境函数的最后两个参数意义相同。不想分配的话赋值为0。

usrmempp是输出参数,带回分配的用户内存的指针。

一个实际的例子,在创建OCI环境后,第一个要分配的句柄就是处理错误的句柄,类型为OCI_HTYPE_ERROR,我们来看一下。

sword       rc;

rc = OCIHandleAlloc(
        (const void *)envhp,
        (void **)&errhp,
        OCI_HTYPE_ERROR,
        0,
        (void **)NULL
);

if (rc != OCI_SUCCESS) {
        fprintf(stderr, "OCIHandleAlloc() - allocate OCI error handle error !\n");
        return (-1);
}

下一节我们再来看看还要分配哪些句柄,怎样连接到数据库。

OCI编程基础篇(二) 创建环境、分配句柄的更多相关文章

  1. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  2. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  3. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  4. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  5. php基础篇-二维数组排序 array_multisort

    原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...

  6. docker+k8s基础篇二

    Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...

  7. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  8. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

  9. JavaScript笔记基础篇(二)

    基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...

  10. g4e基础篇#5 创建分支和保存代码

    章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git 分布式版本控制系统的优势 Git 安装和设置 了解Git存储库(Repo) 起步 1 – 创建分支和保存代码 起步 2 – 了解Git ...

随机推荐

  1. 代码随想录第三天 | 链表part01

    链表理论基础 建议:了解一下链表基础,以及链表和数组的区别 文章链接:https://programmercarl.com/链表理论基础.html 不是很了解链表和数组区别的可以先看看以上的文章. 2 ...

  2. CSP2020复赛前小结

    今天用windows下的GUIDE打了一些板子,以下是我遇到的问题. 语言 未定义返回值类型的函数 inline isnum(char ch) { return ch>='0'&& ...

  3. Web前端入门第 65 问:JavaScript 函数参数各种使用方式

    函数参数是什么? 就是函数内部无法确定的一个东西,需要外部传给函数内部的玩意儿,语法上就是写在函数括号中的东东.比如: function test(a) {} 其中的 a 就是 test 函数的参数, ...

  4. C# 组合键 判断,文本框不接受纯回车enter

    //TextBox 必须是多行文本框 private void Txt_Billcode_KeyDown(object sender, KeyEventArgs e) { if (e.Control ...

  5. 精控Spring AI日志

    还在为 Spring AI 默认的日志抓狂吗?想看日志却看不到,一开 DEBUG 就刷屏... 别慌! 今天 NEO 带你解锁一个神级操作:自定义 Advisor,让你轻松掌控 AI 调用的每一个细节 ...

  6. 利用VBA批量删除Excel中的中文/英文/数字或者替换中英文符号

    ↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 在Excel中经常会遇到去除所有的中文,英文或者数字等情况.但是由于Excel并不支持一次替换所有的中文,英文,数字等,所以有些 ...

  7. 树莓派4b安装retropie

    RetropieRetropie可以将你的树莓派或者PC变成一台复古游戏机模拟器. 其基于完整的操作系统之上,你可以把它装在Raspbian系统上,或者直接刷入完整的镜像然后再添加更多的软件.Retr ...

  8. 前端开发系列124-进阶篇之html-parser

    本文简单研究 html标签的编译过程,模板的编译是前端主流框架中的基础部分,搞清楚这块内容对于理解框架的工作原理.`virtual-DOM` 有诸多益处 ,因限于篇幅所以本文将仅仅探讨把 html 字 ...

  9. Codeforces Round #665 (Div. 2) ABC题解

    A. Distance and Axis 题意:给出OX坐标上OA的长度,每次可以将A移动一个单位,问最少多少次可以找出坐标B的整数解使得 | OB - AB | = k. 思路:分类讨论. 1.若B ...

  10. 什么是iPaaS?iPaaS选型、落地及案例分析

    在iPaaS行业摸爬滚打已经8个年头了.从最初的技术支持做起,到现在负责整个集成项目的规划和实施,我见证了iPaaS技术在国内的快速发展.今天,我想和大家深入聊聊iPaaS这个话题,希望能给正在考虑数 ...