质故障前的一个指定事务一致状态。 不管哪种形式,介质故障的恢复总是将整个数据库恢复到故障之前的一个事务一致状态。如果数据库是在ARCHIVELOG方式运行,可有不同类型的介质恢复:完全介质恢复和不完全介质恢复。 完全介质恢复可恢复全部丢失的修改。仅当所有必要的日志可用时才可能。有不同类型的完全介质恢复可使用,其决定于毁坏文件和数据库的可用性。例: ● 关闭数据库的恢复。当数据库可被装配却是关闭的,完全不能正常使用,此时可进行全部的或单个毁坏数据文件的完全介质恢复。 ●打开数据库的离线表空间的恢复。当数据库是打开的,完全介质恢复可以处理。未损的数据库表空间是在线的可以使用,而受损耗捕空间是离线的,其所有数据文件作为恢复的单位。 ● 打开数据库的离线表间的单个数据文件的恢复。当数据库是打开的,完全介质恢复可以处理。未损的数据库表空间是在线的可以使用,而所损的表空间是离线的,该表空间的指定所损的数据文件可被恢复。 ●使用后备的控制文件的完全介质恢复。当控制文件所有拷贝由于磁盘故障而受损时,可进行介质恢复而不丢失数据。 不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复。重构受损的数据库,使其恢复介质故障前或用户出错之前的一个事务一致性状态。不完全介质恢复有不同类型的使用,决定于需要不完全介质恢复的情况,有下列类型:基于撤消、基于时间和基于修改的不完全恢复。 基于撤消恢复:在某种情况,不完全介质恢复必须被控制,DBA可撤消在指定点的操作。基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏,不能用于恢复过程时使用,所以介质恢复必须控制,以致在使用最近的、未损的日志组于数据文件后中止恢复操作。 基于时间和基于修改的恢复:如果DBA希望恢复到过去的某个指定点,不完全介质恢复地理想的。可在下列情况下使用: ●当用户意外地删除一表,并注意到错误提交的估计时间,DBA可立即关闭数据库,恢复它到用户错误之前时刻。 ●由于系统故障,一个在线日志文件的部分被破坏,所以活动的日志文件突然不可使用,实例被中止,此时需要介质恢复。在恢复中可使用当前在线日志文件的未损部分,DBA利用基于时间的恢复,一旦有将效的在线日志已应用于数据文件后停止恢复过程。 在这两种情况下,不完全介质恢复的终点可由时间点或系统修改号(SCN)来指定。
Pro * C 的使用
一. Pro*C 程序概述: 1.什么是Pro*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块, 以改进应用程序的性能, 特别是在网络环境下,可以减少网络传输和处理的总开销。
2.Pro*C的程序结构图 通俗来说,Pro*C程序实际是内嵌有SQL语句或PL/SQL块的C程序, 因此它的组成很类似C程序。 但因为它内嵌有SQL语句或PL/SQL块, 所以它还含有与之不同的成份。为了让大家对Pro*C有个感性的认识, 特将二者差别比较如下: C的全程变量说明 C源程序 函数1:同函数K。 函数2:同函数K。
C的局部变量说明 函数K 可执行语句
应用程序首部 C的外部变量说明 外部说明段(ORACLE变量说明) 通讯区说明
Pro*C源程序 函数1:同函数K。 函数2:同函数K。 C局部变量说明 程序体 内部说明部分 内部说明段 通讯区说明 函数K C的可执行语句 可执行语句 SQL的可执行语句 或PL/SQL块
二. Pro*C程序的组成结构
每一个Pro*C程序都包括两部分:(1)应用程序首部;(2)应用程序体 应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做好了准备。应用程序体基本上由Pro*C的SQL语句调用组成。主要指查询SELECT、INSERT、UPDATE、DELETE等语句。 应用程序的组成结构如图所示: EXEC SQL BEGIN DECLARE SECTION (SQL变量的定义) EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLLA;EXEC SQL CONNECT:< 用户名> IDENTIFIED BY: < 口令 > SQL 语句及游标的使用
1. 应用程序首部 应用程序的首部就是Pro*C的开始部分。它包括以下三部分: ● C变量描述部分; ●SQL变量描述部分(DECLARE部分); ●SQL通信区。
(1) .DECLARE部分(描述部分) 描述部分说明程序的SQL变量, 定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE SECTION ;结束的。它可以出现在程序的主部,也可出现在局部 SQL变量的说明和使用 在说明段能为SQL变量指定的数据类型如表所示: 数据类型 描述 CHAR CHAR(n) INT SHORT LONG FLOAT DOUBLE VARCHAR 单字符 n个字符数组 整数 短整数 单精度浮点数 双精度浮点数 变长字符串 这些数据类型实际上就是C语言的数据类型, 其中VARCHAR中视为C数据类型的扩充。这在以后会谈到。 SQL变量的使用应注意以下几点: 必须在描述部分明确定义 必须使用与其定义相同的大小写格式 在SQL语句中使用时,必须在其之前加一个“:”(冒号),但在C语句中引用时不需加冒号。 不能是SQL命令中的保留字。 可以带指示变量。 例如:EXEC SQL BEGIN DECLARE SECTIONS; VARCHAR programe[30]; Int porgsal, pempno; EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT ENAME , SAL INTO: programe, : progsal FROM EMP WHERE EMPNO = : pempno;
(2). 指示器变量的说明和引用 指示变量实际上也是一类SQL变量,它被用来管理与其相关联的宿主变量(即在SQL语句中充 当输入或输出的变量)。每一个宿主变量都可定义一个指示器变量,主要用于处理空值(NULL) 指示器变量的说明基本同一般SQL变量一样, 但必须定义成2字节的整型,如SHORT、INT。在SQL语句中引用时, 其前也应加“:”(冒号),而且必须附在其相关联的宿主变量之后,在C语句中,可独立使用。当指示器变量为-1时,表示空值。例如: EXEC SQL BEGIN DECLARE SECTION ; INT dept- number; SHORT ind – num; CHAR emp –name; EXEC SQL END DECLARE SECTION ;
Scanf(“90d %s”, & dept- number , dept – name ); If (dept – number ==0) Ind – num = -1; Else Ind – num = 0; EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME) VALUES(:dept – number : ind- num , :dept – name); 其中ind – num是dept – number 的指示器变量。当输入的dept – number 值是0时, 则向DEPT 表的DEPTNO列插入空值。 (3).指针SQL变量的说明和使用 指针SQL变量在引用前也必须在DECLARE 部分先说明。其说明格式同C语言。在SQL语句中引用时,指针名字前要加前缀“:”(冒号)而不加“*”(星号)。在C语句中用法如同C语言的指针变量。 (4).数组SQL变更的说明和引用 在SQL语句中引用数组时,只需写数组名(名字前加冒号), 不需写下标,在C语句中用法如同C语言的数组变量。 使用数组可大大降低网络传输开销。如要向一表插入100行数据,如果没有数组,就要重复100次, 而引用后,只须执行一次insert语句、便可一次性插入。例如: EXEC SQL BEGIN DECLARE SECTION; Int emp_number[100]; Char emp_name[100][15]; Float salary[100],commission[100]; Int dept_number; EXEC SQL END DECLARE SECTION; …. EXEC SQL SELECT EMPNO,ENAME,SAL,COMM INTO :emp_number,:emp_name,:salary,:commission FROM EMP WHERE DEPTNO=:dept_number; 在使用数组时,应注意以下几点; 不支持指针数组 只支持一维数组, 而 emp-name [100][15]视为一维字符串 数组最大维数为32767 在一条SQL语句中引用多个数组时,这些数组维数应相同 在VALUES , SET, INTO 或WHERE子名中, 不允许把简单SQL变量与数组SQL变量混用 不能在DELARE部分初始化数组 例如:下面的引用是非法的 EXEC SQL BEGIN DECLARE SECTION; Int dept – num [3] = {10,20,30}; EXEC SQL END DECLARE SECTION ;
EXEC SQL SELECT EMPNO, ENAME , SAL INTO : emp – num [ i ], : emp – name [ i ], : salarg [ i ] FROM EMP (5) 伪类型VARCHAR的说明和引用 VARCHAR变量在引用之前也必须在说明段说明, 说明时必须指出串的最大 长度,如: EXEC SQL BEGIN DECLARE SECTION; Int book – number; VARCHAR book – name [ 50 ]; EXEC SQL END DECLARE SECTION ; 在预编绎时, book – name 被翻译成C语言中的一个结构变量; Struct { unsigned short len ; Unsigned chart arr [ 20 ] ; } boo – name 由此看出, VARCHAR变量实际上是含长度成员和数组成员的结构变量。在SQL语句中引用时,应引用以冒号为前缀的结构名, 而不加下标,在C语句 中引用结构成员。 VARCHAR变量在作输出变量时,由ORACLE自动设置, 在作为输入变量时,程序应先把字符串存入数组成员中, 其长度存入长度成员中,然后再在SQL语句中引用。例如: Main( ) { ....... scanf(“90s, 90d’, book – name .arr, & book – number ); book – name .len = strlen (book – name .arr); EXEC SQL UPDATE BOOK SET BNAME = : book – name ; BDESC = : book – number ; } SQL通信区 SQL 通信区是用下列语句描述的: EXEC SQL INCLUDE SQLCA; 此部分提供了用户运行程序的成败记录和错误处理。
SQLCA的组成 SQLCA是一个结构类型的变量,它是ORACLE 和应用程序的一个接口。在执行 Pro*C程序时, ORACLE 把每一个嵌入SQL语句执行的状态信息存入SQLCA中, 根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示: Struct sqlca { char sqlcaid [ 8 ] ; ----?标识通讯区 long sqlabc; ---? 通讯区的长度 long sqlcode; ---?保留最近执行的SQL语句的状态码 struct { unsigned short sqlerrml; -----?信息文本长度 }sqlerrm; char sqlerrp [ 8 ]; long sqlerrd [ 6 ]; char sqlwarn [ 8 ]; char sqlext [ 8 ]; } struct sqlca sqlca; 其中, sqlcode在程序中最常用到,它保留了最近执行的SQL语句的状态码。程序员根据这些状态码做出相应的处理。这些状态码值如下: 0: 表示该SQL语句被正确执行,没有发生错误和例外。 >0:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据)。 <0:表示由于数据库、系统、网络或应用程序的错误,ORACLE未执行该SQL语句。 当出现此类错误时,当前事务一般应回滚。
2.应用程序体 在Pro*C程序中, 能把SQL语句和C语句自由地混合书写,并能在SQL语句中使用SQL变量,嵌入式SQL语句的书写文法是: 以关键字EXEC SQL开始 以C语言的语句终结符(分号)终结 SQL语句的作用主要用于同数据库打交道。C语言程序用于控制,输入,输出和数据处理等。 连接到ORACLE数据库 在对数据库存取之前,必须先把程序与ORACLE数据库连接起来。即登录到ORACLE上。所连接命令应该是应用程序的第一个可执行命令。连接命令格式如下: EXEC SQL CONNECT:< 用户名 > IDENTIFIED BY : < 口令 > 或EXEC SQL CONNECT: < 用户名 > / < 口令 > 在使用上述两种格式进行登入时, 应当首先在说明段定义包含用户名和口令的 SQL 变量,并在执行CONNECT之前设置它们,否则会造成登录失败。例如: EXEC SQL BEGIN DECLARE SECTION ; VARCHAR usename [20]; VARCHAR password[20]; EXEC SQL END DECLARE .......... strcpy ( usename.arr, “CSOTT’); usename.len = strlen (username.arr); strcpy (password.arr , “TIGER’); password .len = strlen( password .arr); EXEC SQL WHENEVER SQLERROR GOTO SQLERR; EXEC SQL CONNECT :username INDNTIFIED BY : password; 注意: 不能把用户名和口令直接编写到CONNECT语句中,或者把用引号(’)括起来的字母串在CONNECT 语句中, 如下面的语句是无效的。 EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER; EXEC SQL CONNECT ‘SCOTT’ IDENTIFIED BY ‘TIGER’; (2). 插入、更新和删除 在讲述SQL语言时已详细讲过, 这里就不举例说明了。 (3). 数据库查询及游标的使用 在PRO*C中, 查询可分为两种类型: 返回单行或定行数的查询; 返回多行的查询.此种查询要求使用游标来控制每一行或每一组(主变量用数组). 返回单行或定行数的查询 在PRO*C中的查询SQL SELECT语句由以下几个子句组成: SELECT INTO FROM WHERE CONNECT BY UNION INTERSECT MINUS GROUP BY HAVING ORDER BY 其中WHERE子句中的查询条件可以是一个属性或多个属性的集合,在执行是赋值的主变量也可放在WHERE子句中.WHERE子句中所用的主变量称为输入主变量。如: SELECT EMPNO, JOB, SAL INTO:PNAME, :PJOB, :PSAL FROM EMP WHERE EMPNO=:PEMPNO; 若没有找到限定的行, 则SQLCA.SQLCODE返回”+1403”, 表明”没有找到”。 INTO从句中的主变量叫输出主变量,它提供了查询时所需要的信息。 在任何项送给主变量之前,都要求ORACLE把这些项转换成主变量的数据类型。对于数字是通过截断来完成的(如:9.23转换为9)。 如果已确定查询只返回一行,那么就不必使用游标,只给SELECT语句增加一个INTO子句即可。在语义上INTO语句在FROM之前的查询中有多少个选择项就有多少个输出主变量。若在SELECT项中表达式的数目不等于INTO子句中主变量的数目,就把SQLCA.SQLWARN[3]置为”W”。
2)多行查询及游标的使用 如果查询返回多行或不知道返回多少行,使用带有ORACLE游标(CURSOR)的SELECT语句。 游标是ORACLE和PRO*C存放查询结果的工作区域。一个游标(已命名的)与一条SELECT语句相关联。操作游标有由4条命令:(1)DECLARE CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。
定义游标
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页 |