首页 Oracle+ProC+编程入门

Oracle+ProC+编程入门

举报
开通vip

Oracle+ProC+编程入门 Oracle Pro*C 编程入门 易初电子有限公司 第 1 页 共 20 页 Oracle Pro*C 编程入门 研发中心 刘小强 Oracle Pro*C 编程入门 易初电子有限公司 第 2 页 共 20 页 目录 1 引言..............................................................

Oracle+ProC+编程入门
Oracle Pro*C 编程入门 易初电子有限公司 第 1 页 共 20 页 Oracle Pro*C 编程入门 研发中心 刘小强 Oracle Pro*C 编程入门 易初电子有限公司 第 2 页 共 20 页 目录 1 引言...........................................................................................................................................3 1.1 编写目的...................................................................................................................3 1.2 编写背景...................................................................................................................3 1.3 参考资料...................................................................................................................3 2 Pro*C简介 ................................................................................................................................3 3 预编译与编译...........................................................................................................................4 3.1 例程...........................................................................................................................4 3.2 编译过程...................................................................................................................4 3.3 Pro*C头文件和库文件.............................................................................................4 3.4 编译过程举例...........................................................................................................4 3.5 Oracle预编译选项配置文件。 ................................................................................4 4 Pro*C语法结构 ........................................................................................................................6 4.1 嵌入SQL语句在程序中的标志。 ...........................................................................6 4.2 换行...........................................................................................................................6 4.3 程序结构...................................................................................................................6 4.4 程序中对数据库的连接...........................................................................................6 4.5 嵌入PL/SQL块 .........................................................................................................7 4.6 大小写.......................................................................................................................7 4.7 嵌入的SQL语句分类 ...............................................................................................7 4.8 宿主变量...................................................................................................................8 4.9 预编译选项配置文件...............................................................................................8 4.10 伪数据类型...............................................................................................................9 4.11 注释...........................................................................................................................9 4.12 换行...........................................................................................................................9 4.13 游标的使用。...........................................................................................................9 4.14 WHENEVER语句。 ..............................................................................................11 4.15 事务处理语句.........................................................................................................12 5 动态SQL .................................................................................................................................12 5.1 Oracle方法 ..............................................................................................................13 5.1.1 动态SQL语句的处理过程 .............................................................................13 5.1.2 Oracle使用动态SQL的四种方法...................................................................13 5.2 ANSI方法 ...............................................................................................................16 5.2.1 使用ANSI方法的一些注意事项....................................................................16 5.2.2 ANSI方法和Oracle方法的不同 .....................................................................16 5.2.3 ANSI处理方法对动态SQL语句的处理步骤 ................................................16 5.2.4 程序举例.........................................................................................................17 Oracle Pro*C 编程入门 易初电子有限公司 第 3 页 共 20 页 1 引言 1.1 编写目的 a. 针对公司现状, 给公司员工提供一个学习 Pro*C 的入门教材, 使公司员工 能尽快熟悉 Oracle 的嵌入式开发技术 1.2 编写背景 a. 公司原有系统的后台数据库为 Informix, 现拟向 Oracle 进行移植。 b. 公司原有程序中有一大部分是基于 Informix 数据库的,因为数据库的移植, 所以原有程序也要相应的做改变。 1.3 参考资料 序号 名称 作者 发布日期 出版单位 1 《Oracle 数据库高级应用 开发技术》 袁鹏飞 2000/7 人民邮电出版社 2 《Oracle Pro*C 程序设计》 电子文档 3 《Oracle 培训教材》 电子文档 2 Pro*C 简介 在 ORACLE 数据库管理和系统中, 有三种访问数据库的方法; ⑴.用 SQL*Plus, 它有 SQL 命令以交互的应用程序访问数据库; ⑵.用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有 SQL*Froms,QL*Reportwriter,SQL*Menu 等; ⑶.利用在第三代语言内嵌入的 SQL 语言或 ORACLE 库函数调用来访问。 Pro*C 就属于第三种开发工具之一, 它把过程化语言 C 和非过程化语言 SQL 最完 善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使 用户可以通过编程完成各种类型的报 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 。在 Pro*C 程序中可以嵌入 SQL 语言, 利 用这些 SQL 语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插 入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。 在 Pro*C 程序中还可以嵌入 PL/SQL 块, 以改进应用程序的性能, 特别是在网络 环境下,可以减少网络传输和处理的总开销。 Oracle Pro*C 编程入门 易初电子有限公司 第 4 页 共 20 页 3 预编译与编译 3.1 例程 UNIX下 Pro*C和例程在 $ORACLE_HOME/precomp/demo/proc下, 用户可根据自己的 需要查看相关的例程。 3.2 编译过程 Pro*C 源文件(*.pc)ÆC 源文件(*.c)Æ目标文件(*.o)->可执行文件 3.3 Pro*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: $proc iname=sample1.pc oname=sample1.c .cÆ.o $cc –c sample1.c .oÆ可执行文件 $cc –L$ORACLE_HOME/lib –lclntsh –o sample1 sample1.o 3.5 Oracle预编译选项配置文件。 Pro*C 预编译时的选项很多, 可以把它放到一个文件中. 如果在预编译时不指定配置文件, 则默认配置文件是 $ORACLE_HOME/precomp/admin/pcscfg.cfg 这个文件一开始是空的, 用户可以把一些最常用的预编译选出项写在里面。 预编译配置选项见下表(更加详细的表请见《Oracle8i 数据库高级应用开发技术》, 公司内部资料): AUTO_CONNECT 允许自动连接到 ops$ 帐号 Oracle Pro*C 编程入门 易初电子有限公司 第 5 页 共 20 页 CHAR_MAP* 正在映射字符数组和字符串 CLOSE_ON_COMMIT 关闭所有 COMMIT 游标 CODEKR_C 将要生成的代码类型 COMP_CHARSET C 编译器支持的字符集类型 CONFIG 用另一配置文件覆盖系统配置文件 CPP_SUFFIX 覆盖缺省的 C++ 文件名后缀 DBMSNATIVE 兼容模式 DEF_SQLCODE 生成 '#define SQLCODE sqlca.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 读取 Oracle Pro*C 编程入门 USERID 用户名/口令 [@dbname] 连接串 VARCHAR 允许使用隐式 varchar 结构 VERSION* 将要返回的对象版本 4 Pro*C 语法结构 4.1 嵌入 SQL语句在程序中的标志。 嵌入式语句以 EXEC SQL 开头, 以分号结束. 4.2 换行 当一行写不下一条嵌入式 SQL 语句时, 可以用反斜线(\)换行(也可以不用, 但为 了程序的可读性好一些, 建议使用) 4.3 程序结构 每一个 Pro*C 程序都包括两部分:(1)应用程序首部;(2)应用程序体 应用程序首部定义了 ORACLE 数据库的有关变量, 为在 C 语言中操纵 ORACLE 数据 库做好了准备。应用程序体基本上由 Pro*C 的 SQL 语句调用组成。主要指查询 SELECT、INSERT、UPDATE、DELETE 等语句。 应用程序的组成结构如图所示: 易初电子有限公司 第 6 页 共 20 页 EXEC SQL BEGIN DECLARE SECTION (SQL 变量的定义) EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLLA; EXEC SQL CONNECT:< 用户名> IDENTIFIED BY: < 口令 > SQL 语句及游标的使用 4.4 程序中对数据库的连接 这里着重说一下 Pro*C 中的 CONNECT 部分: connect 部分用于连接数据,Oracle 的数据库是基于表空间的数据库, 它不像 Informix 那样是多库结构, Oracle 只有一个库! 下面例程详细介绍了 Pro*C 的连接过程: int connect() { printf("Now we will connect to Oracle database\n"); printf("\nPlease input your username:"); 描述部分 SQL 通信区 应用程序体 应用程序首部 Oracle Pro*C 编程入门 易初电子有限公司 第 7 页 共 20 页 fgets(username,sizeof(username),stdin); username[strlen(username)-1]='\0'; printf("\nPlease input your password:"); fgets(password,sizeof(password),stdin); password[strlen(password)-1]='\0'; EXEC SQL WHENEVER SQLERROR GOTO error_msg; //真正起连接做用的是下面这一句 EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("Connect successed!\n"); return 0; error_msg: printf("Connect failed\n"); return -1; } 4.5 嵌入 PL/SQL块 当应用程序需要嵌入 PL/SQL 块时, 需要在 PL/SQL 块的前面加上 EXEC SQL EXECUTE, 在结尾加上 END-EXEC 和分号. 内嵌的 PL/SQL 块和 Oracle 中的 PL/SQL 块的用法一致。 4.6 大小写 嵌入式语句内不区分大小写. 4.7 嵌入的 SQL语句分类 嵌入的 SQL 语句可分为两类:可执行语句和伪指令。 可执行语句就是一般的 SQL 语句, 伪指令用于声明 ORACLE 对象, 通信区域和 SQL 变量等. 伪指令语句名称 说明 ARRAYLEN 在 PL/SQL 中使用宿主数组 BEGIN DECLARE SECTION END DECLARE SECTION 在预编译源程序中定义宿主变量和指示符 变量声明区域 DECLARE 命名 Oracle 模式对象 INCLUDE 拷贝文件 TYPE 数据类型等价处理 VAR 变量类型等价处理 WHENEVER 运行错误处理 Oracle 中可执行的 SQL 语句如下: Oracle Pro*C 编程入门 嵌入式 SQL 语句 说明 CONNECT, CLOSE, ALLOCATE, FREE, CREATE, ALTER, DROP, GRANT, REVOKE, AUDIT, NOAUDIT, CONTEXT, ENABLE THREADS, RENAME, COMMENT, ANALYZE, TRUNCATE 数据定义与控制语句 INSERT, UPDATE, DELETE, SELECT, OPEN, FETCH, LOCK TABLE, EXPLAIN PLAN 数据处理语句 COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION 事务处理语句 DESCRIBE, EXECUTE, PREPARE 动态 SQL 处理语句 ALTER SESSION, SET ROLE 会话控制语句 4.8 宿主变量 宿主变量的使用是为了实现 Oracle 数据库和应用程序之间的数据通信。 ⑴. 定义 和 Informix 类似,Pro*C 中宿主变量也有两种定义方法。 a. ANSI 方法。 按照 ANSI 标准, 只有在 Pro*C 预编译程序的宿主变量声明区内声明的变量 才能做为宿主变量。宿主变量声明区域为 EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 语句之间的区域。 b. Oracle 方法 Oracle 对 ANSI 标准进行了扩充, 它允许在程序中的任何部分声明宿主变 量, 所以, 当把预编译选项 MODE 设为 ORACLE 时, 应用程序不必在指定 的声明区域内声明宿主变量。 ⑵. 使用 SQL 语句或 PL/SQL 块参照宿主变量时, 必须在宿主变量名称前加冒号, 以 区别于 Oracle 数据库对象名称。 但在 C 语句在使用这些变量时, 则不能加 冒号. 注意: Pro*C 应用程序中不能使用宿主变量提供数据库对象名称, 所以, 在 CREATE, ALTER 和 DROP 等 DDL 语句中不能使用输入宿主变量。 4.9 预编译选项配置文件 Oracle 的预编译选项可以存在不同的文件中, 用的时候只要指定某个配置文件就 可以了, 如果不指定, Oracle 有一个默认的配置文件,你可以把一些常用的配置 放在这里, 默认情况下这个配置文件在$ORACLE_HOME/precomp/admin 下, 名为 pcscfg.cfg. 一般刚安装的系统, 这个文件是空的, 自己可以写进去一些自己想 要的配置进去。 易初电子有限公司 第 8 页 共 20 页 Oracle Pro*C 编程入门 易初电子有限公司 第 9 页 共 20 页 4.10 伪数据类型 宿主变量数据类型除原有 C 类型外新增三个伪数据类型。 它们是: VARCHAR[n] SQL_CURSOR SQL_CONTEXT 4.11 注释 预编译源程序中 C/C++语句的注释方法遵循 C/C++语法规则, 可以采用以下两种注 释 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 : C 语言格式 : /* */ C++语言格式 在嵌入式语句中, 注释信息只能采用 C 注释格式和 ANSI 格式, ANSI 注释格式是 用(--)做注释符, 从注释符到行尾的所有内容为注释信息. 4.12 换行. Pro*C 中 嵌入的 SQL 语句若需要换行, 可用“\”进行换行, 但是也可以不用, 用 “\”主要是为了使程序的可读性强一些。 4.13 游标的使用。 4.14 Oracle中的游标 Oracle 使用两种游标: 显式游标和隐式游标. 不管语句返回多少条记录, Oracle 为 每条使用的 SQL 语句隐式地定义一个游标. Oracle 为每个 DELETE , UPDATE, INSERT 等SQL命令隐式地声明游标. 用户声明并使用显式游标处理SELECT语 句返回的多条记录. 游标是 ORACLE 和 PRO*C 存放查询结果的工作区域。一个游标(已命名的) 与一条 SELECT 语句相关联。操作游标有由 4 条命令:(1)DECLARE CURSOR; (2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。 A. 定义游标 一个游标必须首先定义, 才能使用它。语法为: EXEC SQL DECLARE 〈游标名〉CORSOR FOR SELECT 〈列〉 FROM 〈表〉 例如: EXEC SQL DECLARE CSOR, CURSOR FOR SELECT ENAME , JOB, SAL FROM EMP WHERE DEPTNO=:DEPTNO; 当赋给一个与查询相关联的游标 CURSOR 之后, 当 SELECT 查询 EMP 时可从 数据库中返回多行,这些行就是 CURSOR 的一个活动区域。 Oracle Pro*C 编程入门 注意: 1) 定义游标必须在对游标操作之前完成; 2) PRO*C 不能引用没有定义的游标; 3) 游标定义后,其作用范围是整个程序。所以对一个程序来讲, 同时定义两个相同的游标是错误的。 B. 申请游标 在定义游标之后, 应用程序在使用游标变量之前, 必须首先调用 ALLOCATE 语句 申请游标, 也就是为游标变量分配内存区域, ALLOCATE 语法格式为: EXEC SQL ALLOCATE :cursor_variable; C. 打开游标 打开游标的 OPEN 语句主要用来输入主变量的内容,这些主要是 WHERE 中使用 的主变量。打开游标的语句是:EXEC SQL OPEN 〈游标名〉 当打开游标后,可以从相关的查询中取出多于一行的结果。所有满足查询标准的 行组成一集合,叫做“游标活动集”。通过取操作,活动集中的每一行或每一组是一 个一个返回的,查询完成后, 游标就可关闭了。如图所示: 定义游标: DECLARE 开始查询: SELECT 打开游标:OPEN 易初电子有限公司 第 10 页 共 20 页 从活动集取数 据:FETCH 查询完成 关闭游标:CLOSE 注意:1)游标处于活动集的第一行前面; 2)若改变了输入主变量就必须重新打开游标。 D. 取数据 从活动集中取出一行或一组把结果送到输出主变量中的过程叫取数据。输出主变量 的定义在取数据语句中。取数据的语句如下: EXEC SQL FETCH〈游标名〉INTO:主变量 1,主变量 2,…… FETCH 的工作过程如图所示: Oracle Pro*C 编程入门 易初电子有限公司 第 11 页 共 20 页 查询结果 查询结果 …… 游标 FETCH 在游标打开后 输出至当前 如图所示的查询结果指满足查询条件的查询结果。使用 FETCH 应注意以下几点: z 游标必须先定义再打开。 z 只有在游标打开之后才能取数据,即执行 FETCH 语句。 z FETCH 语句每执行一次,从当前行或当前组取数据一次,下一行或下一 组向上移一次。游标每次所指的行或组都为当前行或当前组,而 FETCH 每次都是取游标所指定的行或组的数据。 z 当游标活动集空之后,ORCLE 返回一个 SQLCA。SQLCA(=1403)。 z 若希望此游标再操作, 必须先关闭再打开它。 z 在 C 程序中可以开辟一个内存空间,来存放操作结果,这样就能利用开 辟的空间来灵活操纵查询的结果。 E.关闭游标 取完活动集中所有行后,必须关闭游标,以释放与该游标有关的资源。 关闭游标的格式为: EXEC SQL CLOSE 游标名; 例如: EXEC SQL CLOSE C1; ORACLE V5.0 版支持 SQL 格式“CURRENT OF CURSOR”。这条语句将指向一个 游标中最新取出的行, 以用于修改和删除操作。该语句必须有取操作之后使用, 它等同存储一个 ROWID,并使用它。 F. 释放游标 CLOSE 语句在关闭游标变量时, 并未释放游标变量所点用的内存. 所以, 以游标变 量关闭之后应用程序可以重新打开游标变量, 实现各种游标操作. 需要关闭游标变 量并释放经所点用的内存. 方法如下: EXEC SQL FREE :cursor_name; 4.15 WHENEVER语句。 WHENEVER语句是Pro*C最常用的错误信息处理语句。 它能自动检测和集中处理SQL Oracle Pro*C 编程入门 易初电子有限公司 第 12 页 共 20 页 语句运行错误。 而不需要应用程序对每条 SQL 语句进行处理, 从而大大简化 Pro*C/C++应用程序中的错误处理程序设计。 WHENEVER 语句的语法格式为: EXEC SQL WHENEVER ; 例如: EXEC SQL WHENEVER SQLERROR DO BREAK; 其中 condition 指出需要 Oracle 检测的错误,警告等条件, 它有以下几种取值: SQLWARING NOT FOUND SQLERROR Action 参数说明当 Oracle 检测到指定的错误类型后, 应用程序所执行的错误处 理操作,它有以下几种取值: CONTUNUE #应用程序继续执行下一条语句。 DO #应用程序将执制权转移到一个错误处理函数。 DO BREAK #跳出当前所在的循环。 DO CONTINUE #应用程序本次循环取消, 进行下一次循环(注意它 和 CONTINUE 和区别). GOTO label_name #应用程序跳转到 label_name 指定标号处执行. STOP #应用程序立即停止运行, 并回滚未提交的事务。 WHENEVER 语句为声明性语句, 其作用范围从其声明后开始, 直到遇到下一条 相同测试条件的 WHENEVER 语句为止。 在其测试范围内, WHENEVER 语句测试所有可执行 SQL 语句的执行结果。 4.16 事务处理语句 Pro*C 应用程序中的嵌入式事务处理语句包括以下: COMMIT, ROLLBACK, SAVEPOINT 和 SET TRANSACTION. 与 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. 宿主变量的数据类型。 Oracle Pro*C 编程入门 易初电子有限公司 第 13 页 共 20 页 d. 引用的数据库对象, 如列, 索引, 序列, 表, 用户名和视图. 实际上, 动态 SQL 在一般应用中用的相当普遍! Oracle 中动态 SQL 可用以下两种方法实现: 一个是 Oracle 自己的方法, 一个是 ANSI 的方法. 一般建议使用 Oracle 的方法, 但对于较复杂的应用, 可以使用 ANSI 的方法, 因为这样可以使自己的程序简化。 下面先说 Oracle 自己的方法. 5.1 Oracle方法 一般来说, 应该使用一个字符串变量来表示动态 SQL 语句的文本。 但该文本不包 含“EXEC SQL”和分号“;”以及下列嵌入式 SQL 命令: ALLOCATE CLOSE DECLARE DESCRIBE EXECUTE FETCH FREE GET INCLUDE OPEN PREPARE SET WHENEVER 5.1.1 动态 SQL 语句的处理过程 动态 SQL 语句的处理过程如下: a. 构造动态 SQL 语句, 提示用户输入和构造一个动态 SQL 语句文本。 b. 分析该语句: Oracle 对动态 SQL 语句文本进行语法检查, 并检查动态 SQL 语 句所参照的数据库对象是否存在, 以及用户是否具有访问它所参照的对象的权 限。 c. 为 SQL 语句结合宿主变量:在执行语句过程中, Oracle 读取宿主变量地址, 并 从这些变量中读取数据, 式将数据写入这此变量中。 d. 执行 SQL 语句, 实现数据库操作。 5.1.2 Oracle 使用动态 SQL 的四种方法 Oracle 提供了四种处理动态 SQL 的方法, 这四种方法从一到四依次变得复杂,从 功能上说也是依次包含关系, 即前一种方法的功能可以完全由后一种方法实现。 用户可以根据每个任务的难易程度选择一种适合于自己的方法。 有关这四种方法的详细介绍请参考相关手册和 DEMO 程序. a. 方法一 这种方法只能执行非查询语句, 且在非查询动态 SQL 语句内不能包含输入宿主 变量占位符。 这种方法使用 EXECUTE IMMEDIATE 命令立即执行动态 SQL 语句, 所以在每次执 行时, Oracle 需要对语句进行重新解释。 如: … <连接数据库> strcpy(str_sql,“DELETE FROM test001 WHERE name=’username’”); Oracle Pro*C 编程入门 易初电子有限公司 第 14 页 共 20 页 EXEC SQL EXECUTE IMMEDIATE :str_sql; … b. 方法二 这种方法也只能用于执行非查询语句, 并且允许非查询动态 SQL 语句内包含输 入宿主变量占位符, 但它要求在预编译时刻动态 SQL 语句内的占位符数量及输 入宿主变量的数据类型必须确定。 ①. 准备阶段: 调用 PREPARE 语句准备需要执行的动态 SQL 语句, 这时 Oracle 对动态 SQL 语句进行语法分析, 检查它所参照的数据库对象 等; ②. 执行阶段: 调用 EXECUTE 命令执行准备好的动态 SQL 语句。 采用这种方式时, 动态 SQL 被准备好后可以被多次执行, 而不需要 Oracle 在 每次执行时重新解释 SQL 语句。 如: … <连接数据库> strcpy(str_sql,“INSERT INTO test001 values (:K1,:K2,:K3)”); EXEC SQL PREPARE test FROM :str_sql; EXEC SQL EXECUTE test USING :uname, :uaddress,:usex; … 占位符可以是随便给的一个字符, 单词等.它只起占位作用而没有实际意义. c. 方法三 这种方法可以执行包括查询语句在内的动态 SQL 语句, 但它要求在预编译时刻 动态 SQL 语句内选择列表项数,输入宿主变量占位符数据以及输入宿主变量的 数据类型必须确定。 方法三以游标方式执行动态 SQL 语句, 它对 SQL 语句的 处理过程为: ①. 准执行 PREPARE 命令准备 SQL 语句; #实际就是把要执行的动态语句调入内存, 以 便以后对它进行操作。 ②. 执行 DECLARE 命令声明游标; ③. 执行 OPEN 打开游标; ④. 调用 FETCH 语句提取游标; ⑤. 调用 CLOSE 语句关闭游标。 动态 SQL 语句中的数据库对象名称和列名可以在运行时刻指定, 便此时不能以 宿主变量形式指定对象名称或列名. 其实就是多了一个游标的使用。 如下面程序: <连接数据库>; strcpy(sql_stmt, "SELECT name, address, sex FROM test001"); EXEC SQL PREPARE select_stmt FROM :sql_stmt; EXEC SQL DECLARE c1 CURSOR FOR select_stmt; EXEC SQL OPEN c1; EXEC SQL WHENEVER NOT FOUND DO BREAK; while(1) Oracle Pro*C 编程入门 易初电子有限公司 第 15 页 共 20 页 { EXEC SQL FETCH c1 INTO :Name, :address, :sex; printf("The name is: %s, The Address is: %s, The sex is :%s\n", Name, address, sex); } EXEC SQL CLOSE c1; d. 方法四 使用描述符方式处理动态 SQL 语句,它可以执行包括查询语句在内的所有动态 SQL 语句。 这种方式对动态 SQL 语句的限制最小, 它不要求在预编译时确定动 动态 SQL 语句内的选择列表项数,库占位符数量以及宿主变量数据类型, 这些 元素只要在运行时刻能够确定即可。 也就是说这种方法适合于在程序编译时对程序中的SQL语句还一无所知的情况。 方法四通过使用 SQLDA 结构代替宿主变量, 并通过调用 DESCRIBE SELECT LIST 或 DESCRIBE BIND VARIABLES 语句来检索选择列表项和结合变量(即宿主变量) 描述信息, 从而使应用程序能够在运行时刻处理这种类型的动态 SQL 语句。 当 SQLDA 结构用于存列表信息项信息时, 它们被称做查询描述符; 当 SQLDA 结构用于存储结合变量信息时, 它们被称作结合描述符。 SQLDA 结构的详细信息较长, 请参考相关书籍或手册。 这三种方法中前三种比较简单, 这里就不多说了, 方法四最为灵活, 功能最全, 但是也最为复杂. 使用方法共可分为以下 18 个步骤(请参考以下 18 个步骤去看例 程): ⑴. 在宿主变量声明区域声明字符串型宿主变量, 用它存储动态语句文本。 ⑵. 声明查询和结合描述符。 ⑶. 为查询和结合描述符分配内存空间; ⑷. 设置描述符能够最多描述的选择列表项和占位符数量; ⑸. 将动态语句文本拷贝到前面声明的宿主变量字符串中; ⑹. 调用 PREPARE 语句准备宿主变量字符串中的动态语句; ⑺. 为查询语句声明游标; ⑻. 描述结合变量,填充结合描述符; ⑼. 用 DESCRIBE 语句所检索到的占位符实际数据(F)设置结合描述符中的占 位符数据量, 即 N 元素; ⑽. 为 DESCRIBE 语句所检索到的结合变量分配内存, 并为各个结合变量提供 数值; ⑾. 使用结合描述符打开游标; ⑿. 描述选择列表, 填充查询描述符; ⒀. 将查询描述符中的选择列表项数值设为 DESCRIBE 语句所检索到的动态 SQL 语句中的实际选择列表项数; ⒁. 重新设置选择列有项的长度和数据类型; ⒂. 执行 FETCH 语句, 将数据库表中的数据提取到查询描述符所指向的数据缓 冲区中; ⒃. 处理 FETCH 语句返回的选择列值; ⒄. 释放应用程序为选择列, 占位符, 指示符变量和描述符所申请的内存空 Oracle Pro*C 编程入门 易初电子有限公司 第 16 页 共 20 页 间; ⒅. 关闭游标. 5.2 ANSI方法 ANSI 的方法如下: 5.2.1 使用 ANSI 方法的一些注意事项 Pro*C 应用程序的使用 ANSI 处理方法时, 必须将 DYNAMIC 预编译选项值设置为 ANSI。 此外, 还需将 TYPE_CODE 选项设为 ANSI。(这一点要十分注意, 因为这两 个选项不加会出现意想不到的错误,比如说: 如果不加 TYPE_CODE, 程序一样可以 编译通过, 但是执行的结果却和你原来的的想法大相径庭) 5.2.2 ANSI 方法和 Oracle 方法的不同 ANSI 方法和 Oracle 方法相比有以下不同: ①. Oracle 处理方法不支持对象类型, 游标变量, 结构数组, DML 语句的 RETURNING 子句, 多字节字符变量 和 LOB 等,而 ANSI 处理方法支持所有的 Oracle 数据类型。 ②. ANSI 处理方法所使用的描述符为 C/C++结构变量, 它们由应用程序申请, 释放和维护,而 ANSI 处理方法所使用的描述符则为 SQL 描述符, 它们由 Oracle 内部维护。 正是由于 ANSI 方法所使用的描述符是由 Oracle 内部维护, 所以 ANSI 方法比以上 方法四少了一些对于描述符的操作, 比如分配内存空间等。 5.2.3 ANSI 处理方法对动态 SQL 语句的处理步骤 ANSI 处理方法对动态 SQL 语句的处理步骤为: ⑴. 声明宿主变量, 包括动态 SQL 语句存储缓冲区; ⑵. 为输入,输出变量分配描述符; ⑶. 将动态语句文本拷贝到前面(1)中声明的宿主变量字符串中; ⑷. 调用 PREPARE 语句准备宿主变量字符串中的动态语句; #这一步实际上是对 SQL 语句进行语法分析, 检查 它所参照的数据库对象。 ⑸. 用 DESCRIBE 语句描述输入操作; #目的是读取动态 SQL 语句中的输入变量和输出变量等 描述信息,将它们存储到指定的输入描述符和输出描 述符中。 ⑹. 声明动态游标; ⑺. 用 SET DESCRIPTOR 语句设置输出描述符; Oracle Pro*C 编程入门 易初电子有限公司 第 17 页 共 20 页 ⑻. 打开游标; ⑼. 提取游标数据; ⑽. 处理所提取的游标数据; ⑾. 关闭游标; ⑿. 释放输入,输出描述符; 5.2.4 程序举例 #include #include #include #include #include #include #include #define MAX_ITEMS 40 #define BUF_LEN 255 char username[10]; char password[10]; int connect(); int error_proc(); int get_stmt(void); void query_pro
本文档为【Oracle+ProC+编程入门】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_046424
暂无简介~
格式:pdf
大小:292KB
软件:PDF阅读器
页数:20
分类:互联网
上传时间:2011-07-07
浏览量:25