注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 linux服务---DHCP
 帮助

Oracle常用的OCI函数 二


2007-08-19 14:28:56
 标签:Oracle OCI函数   [推送到技术圈]

占位符:在程序中,一些SQL语句需要在程序运行时才能确定它的语句数据,在设计时可用一个占位符来代替,当程序运行时,在它准备好语句后,必须为每个占位符指定一个变量,即将占位符与程序变量地址结合,执行时,Oracle就从这些变量中读取数据,并将它们与SQL语句一起传递给Oracle服务器执行。OCI结合占位符时,它将占位符与程序变量关联起来,并同时要指出程序变量的数据类型和数据长度。
如:select * from test where name=:p1 and age>:p2
:p1和:p2为占位符
指示器变量:由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为NULL或所读取的列值是否为NULL,以及所读取的列值是否被截取。
除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:
作为输入变量时:(如insert ,update语句中)
 =-1:OCI程序将NULL赋给Oracle表的列,忽略占位符结合的程序变量值
>=0:应用程序将程序变量值赋给指定列
作为输出变量时:(如select语句中)
=-2:所读取的列数据长度大于程序变量的长度,则被截取。
=-1:所读取的值为NULL,输出变量的值不会被改变。
=0:数据被完整读入到指定的程序变量中
>0:所读取的列数据长度大于程序变量的长度,则被截取,指示符变量值为所读取数据被截取前的实际长度
三. OCI函数说明
注:红色为输入参数   蓝色为输出参数  ,否则为输入/出参数
示例以下面结构作为说明
  sword     swResult;
OCIBind*  hBind;
 OCIDefine*  hDefine;
OCIStmt      *stmtp
OCIError     *errhp;
OCIStmt       *stmtp
OCISvcCtx  * svchp
OCIEnv * envhpp;
OCISession * usrhp;
sb2 sb2aInd[30]; //指示器变量,用于取可能存在空值的字段
Typedef strcut
{
char tname[40];
int age;
} t_std;
typedef struct
{
sb2     sb2_tname[100];
       sb2     sb2_age[100];
} stdInd_T;  //指示器数组
typedef struct
{
ub2     ub2_tname[100];
      ub2     ub2_age[100];
} stdLen_T; //字段长度
t_std tstd[100];  //数组变量,用于批量操作
stdInd_T tstdInd;
stdLen_T tstdLen;
stdLen_T tstdRet;
t_std std;
各函数数明
1.创建OCI环境
sword OCIEnvCreate(  
OCIEnv **envhpp,  //OCI环境句柄指针
ub4 mode, //初始化模式:OCI_DEFAULT/OCI_THREADED 等
CONST dvoid *ctxp,
CONST dvoid *(*malicfp)(dvoid *ctxp,size_t size),
CONST dvoid *(ralocfp)(dvoid *ctxp,dvoid *memptr,size_t newsize),
CONST void *(*mfreefp)(dvoid *ctxp,dvoid *memptr),
Size_t xstramemsz,
Dvoid **usrmempp
)
eg :
 swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
return FALSE;
sword OCIInitialize (
ub4           mode,
                    CONST dvoid   *ctxp,
                      CONST dvoid   *(*malocfp)   (/* dvoid *ctxp,  size_t size _*/),
                    CONST dvoid   *(*ralocfp) (/*_ dvoid *ctxp, dvoid *memptr, size_t newsize _*/),
                      CONST void    (*mfreefp) (/*_ dvoid *ctxp, dvoid *memptr _*/)
);
sword OCIEnvInit (
OCIEnv    **envhpp,
                  ub4       mode,
                 size_t    xtramemsz,
                  dvoid     **usrmempp
);




    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: