OracleProC编程基础学习资料.docx
- 文档编号:23289352
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:31
- 大小:43.65KB
OracleProC编程基础学习资料.docx
《OracleProC编程基础学习资料.docx》由会员分享,可在线阅读,更多相关《OracleProC编程基础学习资料.docx(31页珍藏版)》请在冰豆网上搜索。
OracleProC编程基础学习资料
OraclePro*C编程入门
研发中心
张保兵
目录
1引言4
1.1编写目的4
1.2编写背景4
1.3参考资料4
2Pro*C简介4
3预编译与编译5
3.1例程5
3.2编译过程5
3.3Pro*C头文件和库文件5
3.4编译过程举例5
3.5Oracle预编译选项配置文件。
5
4Pro*C语法结构7
4.1嵌入SQL语句在程序中的标志。
7
4.2换行7
4.3程序结构7
4.4程序中对数据库的连接7
4.5嵌入PL/SQL块8
4.6大小写8
4.7嵌入的SQL语句分类8
4.8宿主变量9
4.9预编译选项配置文件9
4.10伪数据类型10
4.11注释10
4.12换行.10
4.13游标的使用。
10
4.14WHENEVER语句。
12
4.15事务处理语句13
5动态SQL13
5.1Oracle方法14
5.1.1动态SQL语句的处理过程14
5.1.2Oracle使用动态SQL的四种方法14
5.2ANSI方法16
5.2.1使用ANSI方法的一些注意事项17
5.2.2ANSI方法和Oracle方法的不同17
5.2.3ANSI处理方法对动态SQL语句的处理步骤17
5.2.4程序举例18
1引言
1.1编写目的
a.针对公司现状,给公司员工提供一个学习Pro*C的入门教材,使公司员工能尽快熟悉Oracle的嵌入式开发技术
1.2编写背景
a.公司原有系统的后台数据库为Informix,现拟向Oracle进行移植。
b.公司原有程序中有一大部分是基于Informix数据库的,因为数据库的移植,所以原有程序也要相应的做改变。
1.3参考资料
序号
名称
作者
发布日期
出版单位
1
《Oracle数据库高级应用开发技术》
袁鹏飞
2000/7
人民邮电出版社
2
《OraclePro*C程序设计》
电子文档
3
《Oracle培训教材》
电子文档
2Pro*C简介
在ORACLE数据库管理和系统中,有三种访问数据库的方法;
1.用SQL*Plus,它有SQL命令以交互的应用程序访问数据库;
2.用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;
3.利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。
Pro*C就属于第三种开发工具之一,它把过程化语言C和非过程化语言SQL最完
善地结合起来,具有完备的过程处理能力,又能完成任何数据库的处理品任务,使
用户可以通过编程完成各种类型的报表。
在Pro*C程序中可以嵌入SQL语言,利
用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插
入、修改和删除数据库表中的行,还可以实现事务的提交和回滚。
在Pro*C程序中还可以嵌入PL/SQL块,以改进应用程序的性能,特别是在网络
环境下,可以减少网络传输和处理的总开销。
3预编译与编译
3.1例程
UNIX下Pro*C和例程在$ORACLE_HOME/precomp/demo/proc下,用户可根据自己的需要查看相关的例程。
3.2编译过程
Pro*C源文件(*.pc)C源文件(*.c)目标文件(*.o)->可执行文件
3.3Pro*C头文件和库文件
文件名称
作用
ORACA.H
定义Oracle通信区域(ORACA)结构,应用程序使用ORACA诊断运行时刻错误和监视应用程序所使用的各种Oracle资源
SQLCA.H
定义SQL通信区(SQLCA)结构,每条SQL语句执行后都将更新SQLCA数据,应用程序使用它可以诊断运行时刻错误
SQL2OCI。
H
包含SQLLIB函数,它们使Pro*C应用程序能够获得OCI环境句柄和服务环境句柄
SQLAPR.H
与OCI连接的SQLLIB函数的ANSI原形定义
SQLCPR.H
Pro*C产生的与平台相关的SQLLIB函数的ANSI原形定义
SQLDA.H
包含SQL描述区(SQLDA)数据结构定义
SQLPROTO.H
已经被SQLCPR.H头文件代替,在Pro*C早期版本中有
ORASQL8.LIB
Pro*C/C++输入链接库
3.4编译过程举例
.pc.c:
$prociname=sample1.pconame=sample1.c
.c.o$cc–csample1.c
.o可执行文件$cc–L$ORACLE_HOME/lib–lclntsh–osample1sample1.o
3.5Oracle预编译选项配置文件。
Pro*C预编译时的选项很多,可以把它放到一个文件中.
如果在预编译时不指定配置文件,则默认配置文件是
$ORACLE_HOME/precomp/admin/pcscfg.cfg
这个文件一开始是空的,用户可以把一些最常用的预编译选出项写在里面。
预编译配置选项见下表(更加详细的表请见《Oracle8i数据库高级应用开发技术》,公司内部资料):
AUTO_CONNECT
允许自动连接到ops$帐号
CHAR_MAP*
正在映射字符数组和字符串
CLOSE_ON_COMMIT
关闭所有COMMIT游标
CODEKR_C
将要生成的代码类型
COMP_CHARSET
C编译器支持的字符集类型
CONFIG
用另一配置文件覆盖系统配置文件
CPP_SUFFIX
覆盖缺省的C++文件名后缀
DBMSNATIVE
兼容模式
DEF_SQLCODE
生成'#defineSQLCODEsqlca.sqlcode'宏
DEFINE*
定义预处理器符号
DURATIONTRANSACTION
设置高速缓存中对象的pin持续时间
DYNAMIC
指定Oracle或ANSI动态SQL语义
ERRORS
是否将错误消息发送到终端
ERRTYPE
输入文件的列表文件名称错误
FIPS*
ANSI的FIPS标志不符合用法
HEADER
为预编译标题指定文件扩展名
HOLD_CURSOR*
在游标高速缓存中控制游标保留
INAME
输入文件的名称
INCLUDE*
包括文件的目录路径
INTYPE
有关类型信息的输入文件名称
LINES
将#line指令添加到生成的代码中
LNAME
覆盖缺省列表文件名
LTYPE
列表文件中生成的数据量
MAXLITERAL
生成的文字串的最大长度
MAXOPENCURSORS*
高速缓存的开放游标的最大数量
MODE
代码符合Oracle或ANSI规则
NLS_CHAR
指定国家语言字符变量
NLS_LOCAL
控制NLS字符语义的实现方法
OBJECTS
支持对象类型
ONAME
输出文件名
ORACA*
控制ORACA的使用
PAGELEN
列表文件页面长度
PARSE
控制进行语法分析的非SQL代码
PREFETCH
游标OPEN期间预读取的行数
RELEASE_CURSOR
控制从游标高速缓存中释放游标
SELECT_ERROR*
控制选择标记错误
SQLCHECK*
编译时间SQL校验总量
SYS_INCLUDE
系统标题文件所在目录
THREADS
指示多线程应用程序
TYPE_CODE
将Oracle或ANSI类型代码用于动态SQL
UNSAFE_NULL
允许在没有指示变量的情况下进行>NULL读取
USERID
用户名/口令[@dbname]连接串
VARCHAR
允许使用隐式varchar结构
VERSION*
将要返回的对象版本
4Pro*C语法结构
4.1嵌入SQL语句在程序中的标志。
嵌入式语句以EXECSQL开头,以分号结束.
4.2换行
当一行写不下一条嵌入式SQL语句时,可以用反斜线(\)换行(也可以不用,但为
了程序的可读性好一些,建议使用)
4.3程序结构
每一个Pro*C程序都包括两部分:
(1)应用程序首部;
(2)应用程序体
应用程序首部定义了ORACLE数据库的有关变量,为在C语言中操纵ORACLE数据库做好了准备。
应用程序体基本上由Pro*C的SQL语句调用组成。
主要指查询SELECT、INSERT、UPDATE、DELETE等语句。
应用程序的组成结构如图所示:
应用程序首部
描述部分
SQL通信区
应用程序体
EXECSQLBEGINDECLARESECTION
(SQL变量的定义)
EXECSQLENDDECLARESECTION;
EXECSQLINCLUDESQLLA;
EXECSQLCONNECT:
<用户名>
IDENTIFIEDBY:
<口令>
SQL语句及游标的使用
4.4程序中对数据库的连接
这里着重说一下Pro*C中的CONNECT部分:
connect部分用于连接数据,Oracle的数据库是基于表空间的数据库,它不像
Informix那样是多库结构,Oracle只有一个库!
下面例程详细介绍了Pro*C的连接过程:
intconnect()
{
printf("NowwewillconnecttoOracledatabase\n");
printf("\nPleaseinputyourusername:
");
fgets(username,sizeof(username),stdin);
username[strlen(username)-1]='\0';
printf("\nPleaseinputyourpassword:
");
fgets(password,sizeof(password),stdin);
password[strlen(password)-1]='\0';
EXECSQLWHENEVERSQLERRORGOTOerror_msg;
//真正起连接做用的是下面这一句
EXECSQLCONNECT:
usernameIDENTIFIEDBY:
password;
printf("Connectsuccessed!
\n");
return0;
error_msg:
printf("Connectfailed\n");
return-1;
}
4.5嵌入PL/SQL块
当应用程序需要嵌入PL/SQL块时,需要在PL/SQL块的前面加上
EXECSQLEXECUTE,在结尾加上END-EXEC和分号.
内嵌的PL/SQL块和Oracle中的PL/SQL块的用法一致。
4.6大小写
嵌入式语句内不区分大小写.
4.7嵌入的SQL语句分类
嵌入的SQL语句可分为两类:
可执行语句和伪指令。
可执行语句就是一般的SQL
语句,伪指令用于声明ORACLE对象,通信区域和SQL变量等.
伪指令语句名称
说明
ARRAYLEN
在PL/SQL中使用宿主数组
BEGINDECLARESECTION
在预编译源程序中定义宿主变量和指示符变量声明区域
ENDDECLARESECTION
DECLARE
命名Oracle模式对象
INCLUDE
拷贝文件
TYPE
数据类型等价处理
VAR
变量类型等价处理
WHENEVER
运行错误处理
Oracle中可执行的SQL语句如下:
嵌入式SQL语句
说明
CONNECT,CLOSE,ALLOCATE,FREE,CREATE,ALTER,DROP,GRANT,REVOKE,AUDIT,NOAUDIT,CONTEXT,ENABLETHREADS,RENAME,COMMENT,ANALYZE,TRUNCATE
数据定义与控制语句
INSERT,UPDATE,DELETE,SELECT,OPEN,FETCH,LOCKTABLE,EXPLAINPLAN
数据处理语句
COMMIT,ROLLBACK,SAVEPOINT,SETTRANSACTION
事务处理语句
DESCRIBE,EXECUTE,PREPARE
动态SQL处理语句
ALTERSESSION,SETROLE
会话控制语句
4.8宿主变量
宿主变量的使用是为了实现Oracle数据库和应用程序之间的数据通信。
1.定义
和Informix类似,Pro*C中宿主变量也有两种定义方法。
a.ANSI方法。
按照ANSI标准,只有在Pro*C预编译程序的宿主变量声明区内声明的变量才能做为宿主变量。
宿主变量声明区域为EXECSQLBEGINDECLARESECTION和EXECSQLENDDECLARESECTION语句之间的区域。
b.Oracle方法
Oracle对ANSI标准进行了扩充,它允许在程序中的任何部分声明宿主变量,所以,当把预编译选项MODE设为ORACLE时,应用程序不必在指定的声明区域内声明宿主变量。
2.使用
SQL语句或PL/SQL块参照宿主变量时,必须在宿主变量名称前加冒号,以区别于Oracle数据库对象名称。
但在C语句在使用这些变量时,则不能加冒号.
注意:
Pro*C应用程序中不能使用宿主变量提供数据库对象名称,所以,在
CREATE,ALTER和DROP等DDL语句中不能使用输入宿主变量。
4.9预编译选项配置文件
Oracle的预编译选项可以存在不同的文件中,用的时候只要指定某个配置文件就
可以了,如果不指定,Oracle有一个默认的配置文件,你可以把一些常用的配置
放在这里,默认情况下这个配置文件在$ORACLE_HOME/precomp/admin下,名为
pcscfg.cfg.一般刚安装的系统,这个文件是空的,自己可以写进去一些自己想
要的配置进去。
4.10伪数据类型
宿主变量数据类型除原有C类型外新增三个伪数据类型。
它们是:
VARCHAR[n]SQL_CURSORSQL_CONTEXT
4.11注释
预编译源程序中C/C++语句的注释方法遵循C/C++语法规则,可以采用以下两种注释格式:
C语言格式:
/**/
C++语言格式
在嵌入式语句中,注释信息只能采用C注释格式和ANSI格式,ANSI注释格式是
用(--)做注释符,从注释符到行尾的所有内容为注释信息.
4.12换行.
Pro*C中嵌入的SQL语句若需要换行,可用“\”进行换行,但是也可以不用,用“\”主要是为了使程序的可读性强一些。
4.13游标的使用。
4.14Oracle中的游标
Oracle使用两种游标:
显式游标和隐式游标.不管语句返回多少条记录,Oracle为每条使用的SQL语句隐式地定义一个游标.Oracle为每个DELETE,UPDATE,INSERT等SQL命令隐式地声明游标.用户声明并使用显式游标处理SELECT语句返回的多条记录.
游标是ORACLE和PRO*C存放查询结果的工作区域。
一个游标(已命名的)
与一条SELECT语句相关联。
操作游标有由4条命令:
(1)DECLARECURSOR;
(2)OPENCURSOR;(3)FETCH;(4)CLOSECURSOR。
A.定义游标
一个游标必须首先定义,才能使用它。
语法为:
EXECSQLDECLARE〈游标名〉CORSORFOR
SELECT〈列〉
FROM〈表〉
例如:
EXECSQLDECLARECSOR,CURSORFOR
SELECTENAME,JOB,SAL
FROMEMP
WHEREDEPTNO=:
DEPTNO;
当赋给一个与查询相关联的游标CURSOR之后,当SELECT查询EMP时可从
数据库中返回多行,这些行就是CURSOR的一个活动区域。
注意:
1)定义游标必须在对游标操作之前完成;
2)PRO*C不能引用没有定义的游标;
3)游标定义后,其作用范围是整个程序。
所以对一个程序来讲,同时定义两个相同的游标是错误的。
B.申请游标
在定义游标之后,应用程序在使用游标变量之前,必须首先调用ALLOCATE语句
申请游标,也就是为游标变量分配内存区域,ALLOCATE语法格式为:
EXECSQLALLOCATE:
cursor_variable;
C.打开游标
打开游标的OPEN语句主要用来输入主变量的内容,这些主要是WHERE中使用
的主变量。
打开游标的语句是:
EXECSQLOPEN〈游标名〉
当打开游标后,可以从相关的查询中取出多于一行的结果。
所有满足查询标准的
行组成一集合,叫做“游标活动集”。
通过取操作,活动集中的每一行或每一组是一
个一个返回的,查询完成后,游标就可关闭了。
如图所示:
定义游标:
DECLARE
开始查询:
SELECT
打开游标:
OPEN
从活动集取数据:
FETCH
查询完成
关闭游标:
CLOSE
注意:
1)游标处于活动集的第一行前面;
2)若改变了输入主变量就必须重新打开游标。
D.取数据
从活动集中取出一行或一组把结果送到输出主变量中的过程叫取数据。
输出主变量
的定义在取数据语句中。
取数据的语句如下:
EXECSQLFETCH〈游标名〉INTO:
主变量1,主变量2,……
FETCH的工作过程如图所示:
查询结果
游标
FETCH
查询结果
在游标打开后
……
如图所示的查询结果指满足查询条件的查询结果。
使用FETCH应注意以下几点:
●游标必须先定义再打开。
●只有在游标打开之后才能取数据,即执行FETCH语句。
●FETCH语句每执行一次,从当前行或当前组取数据一次,下一行或下一
组向上移一次。
游标每次所指的行或组都为当前行或当前组,而FETCH
每次都是取游标所指定的行或组的数据。
●当游标活动集空之后,ORCLE返回一个SQLCA。
SQLCA(=1403)。
●若希望此游标再操作,必须先关闭再打开它。
●在C程序中可以开辟一个内存空间,来存放操作结果,这样就能利用开
辟的空间来灵活操纵查询的结果。
E.关闭游标
取完活动集中所有行后,必须关闭游标,以释放与该游标有关的资源。
关闭游标的格式为:
EXECSQLCLOSE游标名;
例如:
EXECSQLCLOSEC1;
ORACLEV5.0版支持SQL格式“CURRENTOFCURSOR”。
这条语句将指向一个
游标中最新取出的行,以用于修改和删除操作。
该语句必须有取操作之后使用,
它等同存储一个ROWID,并使用它。
F.释放游标
CLOSE语句在关闭游标变量时,并未释放游标变量所点用的内存.所以,以游标变
量关闭之后应用程序可以重新打开游标变量,实现各种游标操作.需要关闭游标变
量并释放经所点用的内存.方法如下:
EXECSQLFREE:
cursor_name;
4.15WHENEVER语句。
WHENEVER语句是Pro*C最常用的错误信息处理语句。
它能自动检测和集中处理SQL语句运行错误。
而不需要应用程序对每条SQL语句进行处理,从而大大简化Pro*C/C++应用程序中的错误处理程序设计。
WHENEVER语句的语法格式为:
EXECSQLWHENEVER
例如:
EXECSQLWHENEVERSQLERRORDOBREAK;
其中condition指出需要Oracle检测的错误,警告等条件,它有以下几种取值:
SQLWARING
NOTFOUND
SQLERROR
Action参数说明当Oracle检测到指定的错误类型后,应用程序所执行的错误处
理操作,它有以下几种取值:
CONTUNUE#应用程序继续执行下一条语句。
DO#应用程序将执制权转移到一个错误处理函数。
DOBREAK#跳出当前所在的循环。
DOCONTINUE#应用程序本次循环取消,进行下一次循环(注意它
和CONTINUE和区别).
GOTOlabel_name#应用程序跳转到label_name指定标号处执行.
STOP#应用程序立即停止运行,并回滚未提交的事务。
WHENEVER语句为声明性语句,其作用范围从其声明后开始,直到遇到下一条
相同测试条件的WHENEVER语句为止。
在其测试范围内,WHENEVER语句测试所有可执行SQL语句的执行结果。
4.16事务处理语句
Pro*C应用程序中的嵌入式事务处理语句包括以下:
COMMIT,ROLLBACK,SAVEPOINT和SETTRANSACTION.
与SQL语句相比,嵌入式SQL语句COMMIT和ROLLBACK增加了RELEASE选项,它们要求送闭所有打开的游标,提交或回滚事务,之后断开与Oracle数据库服务器的连接。
所以,应用程序运行结束前应使用带RELEASE选项的COMMIT语句或ROLLBACK语句,显式提交或回滚事务。
并结束用户会话。
5动态SQL
在有些情况下,在编码时SQL语句还不能完整地写出来,而是在程序执行时才能构造出来(也就是说动态SQL语句在程序编译时语句的选择列表和确定,变量数据大于0)。
这种在程序执行临时生成的SQL语句叫动态SQL语句.利用动态SQL来编写Pro*C程序的方法叫动态SQL技术.
在下列情况之一不知道时,使用动态SQL技术:
a.SQL语句的文本.
b.宿主变量的个数。
c.宿主变量的数据类型。
d.引用的数据库对象,如列,索引,序列,表,用户名和视图.
实际上,动态SQL在一般应用中用的相当普遍!
Oracle中动态SQL可用以下两种方法实现:
一个是Oracle自己的方法,一个是ANSI的方法.一般建议使用Oracle的方法,但对于较复杂的应用,可以使用ANSI的方法,因为这样可以使自己的程序简化。
下面先说Oracle自己的方法.
5.1Oracle方法
一般来说,应该使用一个字符串变量来表示动态SQL语句的文本。
但该文本不包含“EXECSQL”和分号“;”以及下列嵌入式SQL命令:
ALLOCATECLOSEDECLA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OracleProC 编程 基础 学习 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)