ProCCplus编程解密.docx
《ProCCplus编程解密.docx》由会员分享,可在线阅读,更多相关《ProCCplus编程解密.docx(16页珍藏版)》请在冰豆网上搜索。
![ProCCplus编程解密.docx](https://file1.bdocx.com/fileroot1/2023-6/17/39d12dfe-4491-48d5-876a-89a2d51c7597/39d12dfe-4491-48d5-876a-89a2d51c75971.gif)
ProCCplus编程解密
Pro*C/C++编程
讲稿
Version1.0
Pro*C/C++Programming
达内IT培训集团
加拿大达内集团
研发二部
修订历史
摘要
日期
修改原因
版本
文档创建
2009-4-18
新建
1.0
目录
1.Pro*C/C++基本结构4
1.1.Pro*C/C++文件结构4
1.2.Pro*C/C++结构说明4
1.2.1.注释4
1.2.2.字面值4
1.2.3.变量说明部分(变量定义部分)5
1.2.4.其他语法规则5
1.3.第一个Pro*C/C++程序6
1.4.编译运行Pro*C/C++程序6
1.4.1.常用编译选项说明6
1.4.2.在window下编译运行7
1.4.3.在Unix下编译运行7
2.Pro*C/C++基础8
3.Pro*C/C++SQL语句8
4.Pro*C/C++PL/SQL块8
5.Pro*C/C++事务处理8
6.Pro*C/C++动态SQL技术8
1.Pro*C/C++基本结构
1.1.Pro*C/C++文件结构
1.2.Pro*C/C++结构说明
1.2.1.注释
a.单行注释
使用ANSISQL标准注释--。
b.多行注释
使用C/C++标准块注释/**/。
1.2.2.字面值
使用C/C++的字面值即可,可以使用C/C++中的后缀L,F,U与前缀0X等。
可以使用在任何地方。
字符串在SQL语句中例外。
1.2.3.变量说明部分(变量定义部分)
a.变量定义部分的语法:
EXECSQLBEGINDECLARESECTION;
……
EXECSQLENDDECLARESECTION;
b.在变量定义部分只能使用的语句:
1.宿主变量和指示变量的定义。
2.C/C++变量。
3.EXECSQLDECLARE语句。
4.EXECSQLINCLUDE语句。
5.EXECSQLVAR语句。
6.EXECSQLTYPE语句。
7.EXECORACLE语句。
8.C/C++注释。
1.2.4.其他语法规则
a.’’与””的区别。
在SQL中‘’表示字符串,””表示区分大小写。
在C中‘’表示字符,””表示字符串。
b.文件长度的限制。
在pc程序中文件是有大小限制的。
c.宿主变量(hostvariable)与指示变量
宿主变量名原则上没有长度限制,但实际预编译只取前面31位。
SQL92标准建议限制在18位符号。
d.续行符号
天下的续行符号都一样\。
可以使用在SQL与C语言中。
e.行长度限制
pc程序的默认行的长度是1024字节。
f.语句结束符号
SQL与C/C++的语句结束符号都是分号;。
1.3.第一个Pro*C/C++程序
#include
#include
#include
#include
/*定义部分*/
EXECSQLBEGINDECLARESECTION;
charusername[10],password[10];
EXECSQLENDDECLARESECTION;
/*程序体*/
intmain()
{
printf("inputname:
");
gets(username);
printf("inputpass:
");
gets(password);
EXECSQLCONNECT:
usernameIDENTIFIEDBY:
password;
if(sqlca.sqlcode==0)
{
printf("connectok\n");
}
else
{
printf("connectfail\n");
}
return0;
}
1.4.编译运行Pro*C/C++程序
1.4.1.常用编译选项说明
1.INAME:
指定输入文件名,该选项是必须的,当该选项是第一个选项的时候,可以省略INAME。
2.ONAME:
指定输出文件名,就是C/C++代码文件。
该选项是可选的,如果不指定该选项,就使用INAME指定的输入文件名,后缀由CPP_SUFFIX选项确定,就是.c或者.cpp。
3.INCLUDE:
该选项指定#include与EXECSQLINCLUDE语句的头文件所在路径。
4.PARSE:
该选项用于指定预编译器解析pc文件的方法,默认值是FULL。
PARSE的值有:
FULL、PARTIAL、NONE。
如果要生成C++代码,则必须指定为NONE、PARTIAL。
如果PARSE设置为NONE与PARTIAL,则必须在定义部分定义宿主变量。
5.SQLCHECK:
该选项用于指定SQL语法和语义的检查方式,默认值是SYNTAX。
SQLCHECK的值有:
SEMANTICS、FULL、SYNTAX。
如果在pc程序中内嵌PL/SQL,则必须设置为SEMANTICS或FULL。
由于设置SEMANTICS或FULL要连接服务器进行语义检查,所以必须设置USERID。
6.USERID:
用户指定用户名、口令、网络服务名。
语法:
USERID=用户/口令@网络服务名
当SQLCHECK设置成SEMANTICS或者FULL的时候必须设置USERID。
注意:
还有很多其他选项,这里不一一介绍,但要注意一点的是:
设置如下选项后MODE=ANSICODE=CPPPARSE=NONE|PARTIAL,宿主变量必须在定义部分声明。
1.4.2.在window下编译运行
在window下编译步骤如下:
1.使用proc预编译pc文件成C或者C++文件。
注意上面选项的使用。
2.在VC++2005的环境下需要配置如下两个目录和一个文件引入:
a)${ORA_HOME}/precomp/include。
b)${ORA_HOME}/oci/include。
c)把${ORA_HOME}/precomp/lib/msvc下的oraSQL9.LIB文件:
该文件引入到项目中。
3.把预编译后的C与C++文件加入项目
1.4.3.在Unix下编译运行
在Unix下的编译步骤如下:
1.使用proc预编译pc文件成C或者C++文件。
注意上面选项的使用。
2.编写Makefile编译预编译后的C或者C++文件。
在编译选项中加入如下头文件与库:
a)${ORA_HOME}/precomp/include。
b)${ORA_HOME}/oci/include。
c)clntsh库
Unix下的Makefile例子:
declare:
declare.c
gccdeclare.c-odeclare-I/oracledata/oracle10g/product/10g/precomp/public-lclntsh
要确定proc的安装路径请使用whichproc查看。
2.Pro*C/C++基础
2.1.数据类型
2.1.1.Oracle内部数据类型
Oracle数据就是Oracle数据库内部使用的数据类型:
VARCHAR2:
变长字符串,最大4000字节
CHAR:
定长字符串,最大2000字节
NUMBER(p,s):
数字类型,p精度,s标度
DATE:
日期时间数据,7字节
RAW:
变长二进制数据,最大2000字节
LONG:
大批量数据,最大2G字节
LONGRAW:
大二进制数据,最大2G字节
CLOB:
大批量字符数据,最大4G
BLOB:
大批量二进制数据,最大4G
BFILE:
OS文件数据
NCHAR,NVARCHAR2,NCLOB:
本地字符集数据
ROWID:
伪列——表行物理地址
日期的格式:
字节
1
2
3
4
5
6
7
含义
世纪
年
月
日
时
分
秒
例子
119
190
12
6
1
1
1
06-DEC-1990
2.1.2.Oracle外部数据类型
Oracle外部数据类型是宿主程序所引用的数据类型,在运行Pro*C/C++程序的时候,Oracle会根据需要将宿主变量的数据类型映射成Oracle外部数据类型,在编写Pro*C/C++程序的时候不能直接使用Oracle外部数据类型来定义宿主变量。
VARCHAR2:
变长字符串
NUMBER:
数字值
INTEGER:
有符号整数
FLOAT:
浮点数
STRING:
以NULL终止的变长字符串
VARNUM:
数字值,但包含数字长度
LONG:
长字符串
VARCHAR:
变长字符串
ROWID:
二进制值
DATE:
日期
VARRAW:
变长二进制
RAW:
定长二进制
LONGRAW:
定长二进制
UNSIGNED:
无符号整数
LONGVARCHAR:
变长字符串
LONGVARRAW:
变长二进制
CHAR:
定长字符
CHARZ:
NULL终止定长字符串
CHARF:
等价CHAR的字符数据类型
MLSLABEL:
操作系统标记
2.1.3.数据类型转换
Pro*C/C++应用程序与Oracle进行数据传递的时候,需要使用宿主变量,并且Oracle会将宿主变量的实际数据类型映射成Oracle外部数据类型,以保证数据类型兼容Oracle的内部数据类型。
数据类型默认映射关系:
宿主变量类型
Oacle外部数据类型
charchar[n]char*
VARCHAR2
STRING
intint*
INTEGER
shortshort*
INTEGER
longlong*
INTEGER
floatfloat*
FLOAT
doubledouble*
FLOAT
VARCHAR*VARCHAR[N]
VARCHAR
2.1.4.定义变量
1.宿主变量
charname[10];
floatsalary;
对于C++,宿主变量必须定义在说明区。
EXECSQLBEGINDECLARESECTION;
charname[10];
floatsalary;
EXECSQLENDDECLARESECTION;
只能定义一维数组,Oracle把二维数组当一维数组处理。
2.指示器变量
指示变量用于处理NULL值,该类型必须定义成2字节的整数变量。
指示变量是可选的,如果要引用该类变量,则必须与宿主变量结合使用。
语法:
short指示变量;
:
宿主变量indicator:
指示变量
Indicator可以省略。
3.VARCHAR变量
语法:
VARCHARusername[20];
经过Pro*C/C++翻译成结构
struct
{
unsignedshortlen;
unsignedchararr[20];
}username;
在Pro*C/C++程序中可以直接使用arr与len成员变量。
4.游标变量
语法:
sql_cursor游标变量;
5.ROWID变量
语法:
OCIRowid*变量名;
6.指针变量
语法:
char*name;
2.2.SQL变量的说明与引用
2.2.1.SQL变量的说明
1.SQL变量在引用之前必须说明。
2.SQL变量说明时可以初始化。
3.SQL变量可以一个语句说明多个变量。
4.SQL变量的说明可以使用auto,static,extern。
但不允许使用register说明修饰符号。
2.2.2.SQL变量的引用
1.直接使用
2.在嵌入SQL中使用
2.3.通信区说明
2.3.1.SQLCA说明
SQLCA是一个结构体类型,是Oracle与应用程序的一个接口,主要处理错误与事件。
2.3.2.SQLCA结构
structsqlca
{
//被初始化唯sqlca,标识SQL通讯区
charsqlcaid[8];
//SQL通讯区的长度
longsqlabc;
//最近执行的SQL语句的状态码
//0:
正确执行
//>0:
执行了语句,但没有记录行返回
//<0:
数据库,系统,网络故障,SQL语句没有执行
longsqlcode;
struct
{
//sqlerrmc中文本长度
unsignedshortsqlerrml;
//与sqlcode一致的对应的错误信息文本
//只有当sqlcode<0才能访问,否则是上次错误信息
charsqlerrmc[70];
}sqlerrm;
//保留字段,没有使用
charsqlerrp[8];
//sqlerrd[0],sqlerrd[1]没有使用
//sqlerrd[2]SQL语句处理的行数,如果SQL执行失败,则没有定义
//sqlerrd[3]没有使用
//sqlerrd[4]出现语法分析错误的字符开始位置,第一个位置是0
//sqlerrd[5]没有使用
longsqlerrd[6];
//警告标记
//sqlwarn[0]其他警告标记设置,该标记就被设置
//sqlwarn[1]字段值被截断输出到宿主变量的时候被设置
//sqlwarn[2]没有使用
//sqlwarn[3]查询字段个数不等于宿主变量个数的时候被设置
//sqlwarn[4]表中记录被没有where子句的delete,update处理的时候被设置
//sqlwarn[5]当EXECSQLCREATE{PROCDURE|FUNCTION|PACKAGE}语句编译错误的时候被设置
sqlwarn[6],sqlwarn[7]没有被使用
charsqlwarn[8];
//没有被使用
charsqlext[8];
};
structsqlcasqlca;
3.Pro*C/C++SQL语句
3.1.Pro*C/C++能嵌入的SQL语句
3.2.嵌入式SQL语句的写法
3.3.应用程序登录
3.4.插入、更新、删除
3.5.查询
3.6.LOB数据的处理
4.Pro*C/C++PL/SQL块
4.1.嵌入PL/SQL块的语法
4.2.PL/SQL块中宿主变量的使用
4.3.使用光标
4.4.存储函数与过程
4.5.错误处理
5.Pro*C/C++事务处理
5.1.事务的定义与提交
5.2.事务回滚
5.3.只读事务
6.Pro*C/C++动态SQL技术
6.1.动态SQL的优点
6.2.动态SQL方法1
6.3.动态SQL方法2
6.4.动态SQL方法3
6.5.动态SQL方法4