OCI编程基础篇(二) 创建环境、分配句柄
访问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编程基础篇(二) 创建环境、分配句柄的更多相关文章
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- php基础篇-二维数组排序 array_multisort
原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...
- docker+k8s基础篇二
Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
- JavaScript笔记基础篇(二)
基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...
- g4e基础篇#5 创建分支和保存代码
章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git 分布式版本控制系统的优势 Git 安装和设置 了解Git存储库(Repo) 起步 1 – 创建分支和保存代码 起步 2 – 了解Git ...
随机推荐
- 第2讲、Transformer架构图详解
1. Transformer架构运行机制 Transformer架构是一种强大的神经网络结构,主要用于自然语言处理任务.它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全基于注意力机制 ...
- java返回数据库中层级结构数据的纯算法写法,以动态菜单为例
说明 1.纯算法版本,跟treeListMap版本比起来的优点是,纯算法版只查询了一次数据库 2.里面有不同角色分配不同的菜单相关代码,注意复制粘贴. 3.可以无限嵌套层次结构,这里只用到了两层,仅为 ...
- MVVM - Model和ViewModel的创建和配置
MVVM-Model和ViewModel的创建和配置 本文同时为b站WPF课程的笔记,相关示例代码 简介 MVVM:Model-View-ViewModel,是一种软件架构的模式.通过引入一个中间层V ...
- 自动 GitHub Readme 20 种语言翻译平台 - OpenAiTx 开源免费
[野人献曝]晚辈开发自动 GitHub Readme 20 种语言翻译平台 - OpenAiTx 开源免费 只需要一键将 GitHub 的网址替换为 OpenAiTx 即可自动进行 AI 翻译 例如: ...
- 使用HTML完成一个最low的页面
1 <body> 2 <div style="background: burlywood"> 3 <h1 style="text-align ...
- USB over IP技术简介
1. USBIP 简介 在 USB 系统中,USB 设备和 USB 主机间通过 USB 线连接在一起.USB 线的长度较短,USB 设备只能安装到 USB 主机周边,设备和主机的距离也就很短.USB ...
- 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅?
title: 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? date: 2025/06/18 10:11:53 updated: 2025/06/18 10:11:53 author: ...
- 数栈运维案例:云上RAC部署、运维及实践案例
数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...
- 4.Java SDK源码分析系列笔记-LinkedList
目录 1. 是什么 2. 如何使用 3. 原理分析 3.1. uml 3.2. 构造方法 3.3. add方法 3.3.1. 确保容量足够容纳新的元素 3.3.2. 把元素放入数组最后一个位置 3.4 ...
- Kong入门学习实践(4)负载均衡与正则路由
最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看.由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版. 本篇,我们学习快速配置 ...