第五期 使用PL/SQL
本期目标:
1.理解PL/SQL功能和特点
2.了解数据类型及其用法
3.理解逻辑比较
4.理解控制结构
5.掌握错误处理
PL/SQL 简介
PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言
PL/SQL 是对SQL的扩展
支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构
可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑
与Oracle服务器和Oracle工具紧密集成,具备可移植性、灵活性和安全性
PL/SQL 的优点
支持SQL,在PL/SQL中可以使用:
数据操纵命令
事务控制命令
游标控制
SQL函数和SQL运算符
支持面向对象编程(OOP)
可移植性,可运行在任何操作系统和平台上的Oracle数据库
更佳的性能,PL/SQL经过编译执行
与SQL紧密集成,简化数据处理
支持所有SQL数据类型
支持NULL值
支持%TYPE和%ROWTYPE属性类型
安全性,可以通过存储过程限制用户对数据的访问
PL/SQL 的体系结构
PL/SQL引擎驻留在Oracle服务器中
该引擎接受PL/SQL块并对其进行编译执行
PL/SQL 块简介
PL/SQL 块是构成PL/SQL程序的基本单元
将逻辑上相关的声明和语句组合在一起
PL/SQL分为三个部分:声明部分、可执行部分和异常处理部分
[DECLARE
declarations]
BEGIN
executable statements
[EXCEPTION
handlers]
END;
eg:
DECLARE
qty_on_hand NUMBER(5);
BEGIN
SELECT quantity INTO qty_on_hand
FROM Products
WHERE product = '芭比娃娃'
FOR UPDATE OF quantity;
IF qty_on_hand > 0 THEN
UPDATE Products SET quantity = quantity + 1
WHERE product = '芭比娃娃';
INSERT INTO purchase_record
VALUES ('已购买芭比娃娃', SYSDATE);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM);
END;
变量和常量
PL/SQL 块中可以使用变量和常量
在声明部分声明,使用前必须先声明
声明时必须指定数据类型,每行声明一个标识符
可执行部分的SQL语句和过程语句中使用
声明变量和常量的语法:
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
给变量赋值有两各方法:
使用赋值语句 :=
使用 SELECT INTO 语句
eg:
DECLARE
icode VARCHAR2(6);
p_catg VARCHAR2(20);
p_rate NUMBER;
c_rate CONSTANT NUMBER := 0.10;
BEGIN
...
icode := 'i205';
SELECT p_category, itemrate * c_rate
INTO p_catg, p_rate
FROM itemfile WHERE itemcode = icode;
...
END;
逻辑比较
逻辑比较用于比较变量和常量的值,这些表达式称为布尔表达式
布尔表达式由关系运算符与变量或常量组成
布尔表达式的结果为TRUE、FALSE或NULL,通常由逻辑运算符AND、OR和NOT连接
布尔表达式有三各类型
数字布尔型
字符布尔型
日期布尔型
控制结构
PL/SQL支持的流程控制结构:
条件控制
IF语句
CASE语句
循环控制
LOOP循环
WHILE循环
FOR循环
顺序控制
GOTO语句
NULL语句
条件控制
IF语句根据条件执行一系列语句,有三各形式:
IF-THEN、IF-THEN-ELSE和IF-THEN-ELSIF
eg:
DECLARE
icode VARCHAR2(4);
irate NUMBER;
BEGIN
icode := 'i203';
SELECT itemrate INTO irate FROM itemfile
WHERE itemcode = icode;
IF irate > 200 THEN
UPDATE itemfile SET itemrate = itemrate - 200
WHERE itemcode = icode;
ELSE
UPDATE itemfile SET itemrate = itemrate - 50
WHERE itemcode = icode;
END IF;
DBMS_OUTPUT.PUT_LINE('itemrate='|| irate);
END;
CASE语句用于根据单个变量或表达式与多个值进行比较
执行CASE语句前,先计算选择器的值
BEGIN
CASE '&grade'
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优异');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE ('优秀');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE ('良好');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE ('一般');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE ('较差');
ELSE DBMS_OUTPUT.PUT_LINE ('没有此成绩');
END CASE;
END;
循环控制
循环控制用于重复执行一系列语句
循环控制语句包括:
LOOP、EXIT 和 EXIT WHEN
循环控制的三种类型:
LOOP - 无条件循环
LOOP
sequence_of_statements
END LOOP;
WHILE - 根据条件循环
WHILE condition LOOP
sequence_of_statements
END LOOP;
FOR - 循环固定的次数
FOR counter IN [REVERSE] value1..value2
LOOP
sequence_of_statements
END LOOP;
顺序控制
顺序控制用于按顺序执行语句
顺序控制语句:
GOTO语句-无条件地转到标签指定的语句
NULL语句-什么也不做的空语句
eg:
DECLARE
qtyhand itemfile.qty_hand%type;
relevel itemfile.re_level%type;
BEGIN
SELECT qty_hand,re_level INTO qtyhand,relevel
FROM itemfile WHERE itemcode = 'i201';
IF qtyhand < relevel THEN
GOTO updation;
ELSE
GOTO quit;
END IF;
<>
UPDATE itemfile SET qty_hand = qty_hand + re_level
WHERE itemcode = 'i201';
<>
NULL;
END;
错误处理
在运行程序时出现的错误叫异常
发生异常后,语句将停止执行,控制权转移到PL/SQL块的异常处理部分
异常有两种类型:
预定义异常-当PL/SQL程序违反Oracle规则或超越系统限制时隐式引发
用户定义异常-用户可以在PL/SQL块的声明部分定义异常,自定义的异常通过RAISE语句显式引发
常见系统异常:
DUP_VAL_ON_INDEX :向有唯一约束的表中插入重复行
NO_DATA_FOUND :在一个select into语句中无返回值
TOO_MANY_ROWS :select into语句返回了多行
VALUE_ERROR :一个算法、转换、截断或大小约束发生错误
ZERO_DIVIDE :发生被0除
错误处理
处理预定义异常:
DECLARE
ordernum VARCHAR2(5);
BEGIN
SELECT orderno INTO ordernum FROM order_master;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE ('返回多行');
END;
处理用户定义异常:
DECLARE
invalidCATEGORY EXCEPTION;
category VARCHAR2(10);
BEGIN
category := '&Category';
IF category NOT IN ('附件','顶盖','备件') THEN
RAISE invalidCATEGORY;
ELSE
DBMS_OUTPUT.PUT_LINE('您输入的类别是'|| category);
END IF;
EXCEPTION
WHEN invalidCATEGORY THEN
DBMS_OUTPUT.PUT_LINE('无法识别该类别');
END;
引发应用程序错误
RAISE_APPLICATION_ERROR过程
用于创建用户定义的错误信息
可以在可执行部分和异常处理部分使用
错误编号必须介于-20000和-20999之间
错误消息的长度可长达2048个字节
引发应用程序错误的语法
RAISE_APPLICATION_ERROR(error_number,error_message);
eg:
DECLARE
rate itemfile.itemrate%TYPE;
rate_exception EXCEPTION;
BEGIN
SELECT NVL(itemrate,0) INTO rate FROM itemfile
WHERE itemcode = 'i207';
IF rate = 0 THEN
RAISE rate_exception;
ELSE
DBMS_OUTPUT.PUT_LINE('项费率为:' || rate);
END IF;
EXCEPTION
WHEN rate_exception THEN
RAISE_APPLICATION_ERROR(-20001, '未指定项费率');
END;
第六期 游标管理
本期目标:
1.掌握游标管理技巧
游标简介
在PL/SQL语句中执行SELECT,INSERT,UPDATE,DELETE语句时,Oracle会在内存中为其分配上下文区(Context Area)。游标是指向该区的指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。它为应用程序提供了一种对具有多行数据的查询结果集中每行数据进行单独处理的方法,是设计互式应用程序的常用编程接口。
分类:
显式游标和隐式游标(还有REF游标,用于处理运行时才能确定的动态SQL查询的结果)
隐式游标
在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为SQL
通过检查隐式游标的属性可以获得最近执行的DML语句的信息
隐式游标的属性有:
%FOUND - SQL语句影响了一行或多行时为TRUE
%NOTFOUND - SQL语句没有影响任何行时为TRUE
%ROWCOUNT - SQL语句影响的行数
%ISOPEN - 游标是否打开,始终为FALSE
eg:
1).
BEGIN
UPDATE toys SET toyprice = 270
WHERE toyid = 'P005';
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('表已更新');
END IF;
END;
2).
BEGIN
UPDATE vendor_master
SET venname = 'Rob Mathew'
WHERE vencode = 'V004';
DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT);
END;
3).
DECLARE
empid varchar2(10);
desig varchar2(10);
BEGIN
empid := '&Employeeid';
SELECT designation INTO desig
FROM employee WHERE empno = empid;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee Not Found');
END;
显式游标
显式游标在PL/SQL块的声明部分精义查询,该查询可以返回多行
显式游标的操作过程:
数据库--(打开游标)-->表--(提取行)-->变量-->关闭游标
示例:
DECLARE
my_toy_price toys.toyprice%TYPE
CURSOR toy_cur IS
SELECT toyprice FROM toys
WHERE toyprice < 250;
BEGIN
OPEN toy_cur;
LOOP
FETCH toy_cur INTO my_toy_price;
EXIT WHEN toy_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('TOYPRICE =: ' || my_toy_price );
END LOOP;
CLOSE toy_cur;
END;
带参数的显式游标:
DECLARE
desig VARCHAR2(20);
emp_code VARCHAR2(5);
empnm VARCHAR2(20);
CURSOR emp_cur(desigparam VARCHAR2) IS
SELECT empno, ename FROM employee
WHERE designation = desigparam;
BEGIN
desig := '&desig';
OPEN emp_cur(desig);
LOOP
FETCH emp_cur INTO emp_code,empnm;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emp_code || '' || empnm);
END LOOP;
CLOSE emp_cur;
END;
使用显式游标更新行
允许使用游标删除或更新活动集中的行
声明游标时必须使用 SELECT ... FOR UPDATE 语句
CURSOR IS SELECT statement FOR UPDATE;
//更新的语法
UPDATE SET WHERE CURRENT OF
//删除的语法
DELETE FROM WHERE CURRENT OF
eg:
DECLARE
new_price NUMBER;
CURSOR cur_toy IS
SELECT toyprice FROM toys WHERE toyprice < 100
FOR UPDATE OF toyprice;
BEGIN
OPEN cur_toy;
LOOP
FETCH cut_toy INTO new_price;
EXIT WHEN cur_toy%NOTFOUND;
UPDATE toys
SET toyprice = 1.1 * new_price
WHERE CURRENT OF cur_toy;
END LOOP;
CLOSE cur_toy;
COMMIT;
END;
循环游标
循环游标用于简化游标处理代码
当用户需要从游标中提取所有记录时使用
循环游标的语法如下:
FOR IN
LOOP
END LOOP;
eg:
DECLARE
CURSOR mytoy_cur IS
SELECT toyid, toyname, toyprice
FROM toys;
BEGIN
FOR toy_rec IN mytoy_cur
LOOP
DBMS_OUTPUT.PUT_LINE(
‘玩具编号:'||' ' ||toy_rec.toyid||' '
||‘玩具名称:'||' '||toy_rec.toyname||' '
||‘玩具单价:'||' '||toy_rec.toyprice);
END LOOP;
END;
游标变量的优点和限制
游标变量的功能强大,可以简化数据处理。
游标变量的优点有:
可以从不同的 SELECT 语句中提取结果集
可以作为过程的参数进行传递
可以引用游标的所有属性
可以进行赋值运算
使用游标变量的限制:
不能在程序包中声明游标变量
FOR UPDATE 子句不能与游标变量一起使用
不能使用比较运算符
第七期 子程序
本期目标:
1.创建和使用子程序
2.创建和使用程序包
子程序
命名的PL/SQL块,编译并存储在数据库中
子程序的各个部分:
声明部分
可执行部分
异常处理部分(可选)
子程序的分类:
过程-执行某些操作
函数-执行操作并返回值
子程序的优点:
模块化-将程序分解为逻辑模块
可重用性-可以被任意数目的程序调用
可维护性-简化维护操作
安全性-通过设置权限,使数据更安全
过程
创建过程的语法:
CREATE [OR REPLACE] PROCEDURE
[()]
IS | AS
BEGIN
[EXCEPTION
]
END;
eg:
CREATE OR REPLACE PROCEDURE
find_emp( emp_no NUMBER)
AS
empname VARCHAR2(20);
BEGIN
SELECT ename INTO empname
FROM emp WHERE empno = emp_no;
DBMS_OUTPUT.PUT_LINE(' THE EMPLOYEE'S NAME IS ' || empname );
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('THE ID NOT FOUND');
END find_emp;
过程参数的三种模式:
IN -默认的参数模式,用于接受调用程序的值
OUT -用于向调用程序返回值
IN OUT -用于接受调用程序的值,并向调用程序返回更新的值
执行过程的语法:
EXECUTE procedure_name(parameters_list);
将过程的执行权限授予其他用户:
GRANT EXECUTE ON procedure_name TO user_name;
删除过程:
DROP PROCEDURE procedure_name;
第八期 触发器和内置程序包
本期目标:
1.理解和应用触发器
2.了解内置程序包
触发器
触发器是当特定事件出现时自动执行的存储过程
特定事件可以是执行更新的DML语句和DDL语句
触发器不能被显式调用
触发器的功能:
自动生成数据
自定义复杂的安全权限
提供审计和日志记录
启用复杂的业务逻辑
创建触发器的语法:
CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]]
[[or] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old /NEW [AS] new}]
[FOR EACH ROW]
[WHEN (condition)]
pl/sql_block;
触发器的组成部分
触发器由三部分组成:
触发器语句(事件)-定义激活触发器的DML事件和DDL事件
触发器限制-执行触发器的条件,该条件必须为真才能激活触发器
触发器操作(主体)-包含一些SQL语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
eg:
CREATE OR REPLACE TRIGGER aiu_itemfile
AFTER INSERT ON itemfile FOR EACH ROW
BEGIN
IF (:NEW.qty_hand = 0) THEN
DBMS_OUTPUT.PUT_LINE('警告:已插入记录,但数量为零');
ELSE
DBMS_OUTPUT.PUT_LIEN('已插入记录');
END IF;
END;
启用、禁用和删除触发器
启用和禁用触发器
ALTER TRIGGER aiu_itemfile DISABLE;
ALTER TRIGGER aiu_itemfile ENABLE;
删除触发器
DROP TRIGGER aiu_itemfile;
查看有关触发器的信息
USER_TRIGGERS数据字典视图包含有关触发器的信息
SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME='EMP';
SELECT TRIGGER_TYPE,TRIGGERING_EVENT,WHEN_CLAUSE FROM USER_TRIGGERS WHERE TRIGGER_NAME='BIU_EMP_DEPTNO';
内置程序包
扩展数据库的功能
为PL/SQL提供对SQL功能的访问
用户SYS拥有所有程序包
是公有同义词
可以由任何用户访问
一些内置程序包:
STANDARD和DBMS_STANDARD -定义和扩展PL/SQL语言环境
DBMS_LOB -提供对LOB数据类型进行操作的功能
DBMS_OUTPUT -处理PL/SQL块和子程序输出调试信息
DBMS_RANDOM -提供随机数生成器
DBMS_SQL -允许用户使用动态SQL
DBMS_XMLDOM -用DOM模型读写XML类型的数据
DBMS_XMLPARSER - XML解析,处理XML文档内容和结构
DBMS_XMLQUERY -提供将数据转换为XML类型的功能
DBMS_XSLPROCESSOR -提供XSLT功能,转换XML文档
UTL_FILE -用PL/SQL程序来读写操作系统文本文件
DBMS_OUTPUT
显示PL/SQL块和子程序的调试信息
eg:
BEGIN
DBMS_OUTPUT.PUT_LINE('打印三角形');
FOR i IN 1..9 LOOP
FOR j IN 1..i LOOP
DBMS_OUTPUT.PUT('*');
END LOOP for_j;
DBMS_OUTPUT.NEW_LINE;
END LOOP for_i;
END;
DBMS_LOB & DBMS_XMLQUERY
前者提供用于处理大型对象的过程和函数,后者用于将查询结果转换为XML格式
eg:
DECLARE
result CLOB;
xmlstr VARCHAR2(32767);
line VARCHAR2(2000);
line_no INTEGER := 1;
BEGIN
result := DBMS_XMLQUERY.getXML('SELECT empno,ename FROM employee');
xmlstr := DBMS_LOB.SUBSTR(result, 32767);
LOOP
EXIT WHEN xmlstr IS NULL;
line := SUBSTR(xmlstr, 1, INSTR(xmlstr, CHR(10))-1);
DBMS_OUTPUT.PUT_LINE(line_no || ':' || line);
xmlstr := SUBSTR(xmlstr, INSTR(xmlstr, CHR(10))+1);
line_no := line_no + 1;
END LOOP;
END;
DBMS_RANDOM
可用来生成随机整数
eg:
DECLARE
l_num NUMBER;
counter NUMBER;
BEGIN
counter := 1;
WHILE counter <= 10
LOOP
l_num := DBMS_RANDOM.RANDOM;
DBMS_OUTPUT.PUT_LINE(l_num);
counter := counter + 1;
END LOOP;
END;
UTL_FILE
UTL_FILE包用于读写操作系统文本文件
操作文件的一般过程是打开、读或写、关闭
UTL_FILE包指定文件路径依赖于 DIRECTORY 对象
eg:
SQL> CREATE DIRECTORY TEST_DIR AS 'C:\DEVELOP';
SQL> GRANT READ,WRITE ON DIRECTORY TEST_DIR TO SCOTT;
DECLARE
input_file UTL_FILE.FILE_TYPE;
input_buffer VARCHAR2(4000);
BEGIN
input_file := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'r');
LOOP
UTL_FILE.GET_LINE(input_file, input_buffer);
DBMS_OUTPUT.PUT_LINE(input_buffer);
END LOOP;
UTL_FILE.FCLOSE(input.file);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('-------------');
END;
第九期 备份与恢复
本期目标:
1. 了解数据库备份与恢复的基础知识
2. 理解在Oracle环境中可能发生的故障类型
3. 掌握导出和导入实用程序
4. 了解数据库归档模式
备份与恢复简介
备份是数据库中数据的副本,它可以保护数据在出现意外损失时最大限度的恢复
Oracle数据库的备份包括以下两种类型:
物理备份-是对数据库的操作系统物理文件(如数据文件、控制文件和日志文件等)的备份
逻辑备份-是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份
故障类型
导致数据库操作中止的故障包括甲种类型:
语句故障-在执行SQL语句过程中发生和逻辑故障可导致语句故障。如果用户编写的SQL语句无效,就会发生逻辑故障
用户进程故障-当用户程序出错而无法访问数据库时发生用户进程故障。导致用户进程故障的原因是异常断开连接或异常终止进程
实例故障-当Oracle的数据库实例由于硬件或软件问题而无法继续运行时,就会发生实例故障
介质故障-在数据库无法正确读取或写入某个数据库文件时,会发生介质故障
导入和导出实用程序
导出和导入实用程序用于实施数据库的逻辑备份和恢复
导出实用程序将数据库中的对象定义和数据备份到一个操作系统二进制文件中
导入实用程序读取二进制导出文件并将对象和数据载入数据库中
导出和导入实用程序的特点有:
可以按时间保存表结构和数据
允许导出指定的表,并重新导入到新的数据库中
可以把数据库迁移到另外一台异构服务器上
在两个不同版本的Oracle数据库之间传输数据
在联机状态下进行备份和恢复
可以重新组织表的存储结构,减少链接及磁盘碎片
使用以下三种方法调用导出和导入实用程序:
命令行参数-在命令行指定执行程序的参数和参数值
交互提示符-以交互的方式提示用户逐个输入参数的值
参数文件-允许用户将运行参数和参数值存储在参数文件中,以便重复使用参数
导出和导入数据库对象的四种模式是:
完全数据库-导出和导入整个数据库中的所有对象
表-导出和导入一个或多个指定的表或表分区
用户-导出和导入一个用户模式中的所有对象
表空间-导出和导入一个或多个指定的表空间中的所有对象
导出实用程序
导出实用程序有以下常用命令参数:
USERID -确定执行导出实用程序的用户名和口令
BUFFER -确定导出数据时所使用的缓冲区大小,其大小用字节表示
FILE -指定导出的二进制文件名称,默认的扩展名是 .dmp
FULL -指定是否以全部数据库方式导出,只有授权用户才可使用此参数
OWNER -要导出的数据库用户列表
HELP -指定是否显示导出表中的数据
TABLES -按表方式导出时,指定需导出的表和分区的名称
PARFILE -指定传递给导出实用程序的参数文件名
TABLESPACES -按表空间方式导出时,指定要导出的表空间名
eg:
//按用户方式导出数据
exp scott/tiger@accp file=scott_back owner=scott
//按表方式导出数据
exp scott/tiger@accp tables=(emp,dept) file=scott_back_tab
//按表空间方式导出数据
exp system/aptech@accp tablespaces=(users) file=tbs_users
//使用参数文件导出数据
exp system/aptech parfile='c:\parameters.txt'
导入实用程序
导入实用程序有如下常用命令参数:
USERID -指定执行导入的用户名和密码
BUFFER -指定用来读取数据的缓冲区大小,以字节为单位
COMMIT -指定是否在每个数组(其大小由BUFFER参数设置)插入后进行提交
FILE -指定要导入的二进制文件名
FROMUSER -指定要从导出转储文件中导入的用户模式
TOUSER -指定要将对象导入的用户名。FROMUSER与TOUSER可以不同
FULL -指定是否导入整个导出转储文件
TABLES -指定要导入的表的列表
ROWS -指定是否要导入表中的行
PARFILE -指定传递给导入实用程序的参数文件名,此文件可以包含这里列出的所有参数
IGNORE -导入时是否忽略遇到的错误,默认为N
TABLESPACES -按表空间方式导入,列出要导入的表空间名
eg:
//将整个文件导入数据库
imp accp/accp@accp file=item_back.dmp ignore=y full=y
//将scott用户的表导入到martin用户
imp system/aptech@accp file=scott_back fromuser=scott touser=martin tables=(emp,dept)
//使用参数文件导入数据
imp system/oracle parfile='c:\parameters.txt'
数据库归档方式
Oracle数据库可以运行在两种归档方式:
非归档日志方式
归档日志方式
非归档日志方式可以避免实例故障,但无法避免介质故障。在此方式下,数据库只能实施冷备份
归档日志方式产生归档日志,用户可以使用归档日志完全恢复数据库
非归档日志方式下数据库的工作原理:
表空间脱机 --> 备份表空间 --> 恢复表空间 --> 表空间联机
归档日志方式下数据库工作原理:
日志文件1填满 --> 准备向日志文件2写入信息 --> 备份日志文件2 --> 清空日志文件2 --> 向日志文件2写入信息
配置归档日志方式
配置数据库在归档日志方式下运行,包括以下三个步骤:
确保数据库当前不处于归档方式 -->
设置相关数据库初始化参数 -->
在归档日志方式下启动数据库
自动归档和手动归档
数据库的日志归档方式有两种:
自动归档-对非活动日志文件进行自动归档
手动归档-允许用户手动归档非活动日志文件的已填充组
获取归档日志信息
可以通过数据字典视图查看归档日志信息
V$ARCHIVE_DEST -显示当前所有归档日志存储位置及其状态
SELECT DEST_ID,DEST_NAME,STATUS,DESTINATION FROM V$ARCHIVE_DEST WHERE STATUS='VALID';
V$ARCHIVED_LOG -显示历史归档日志信息
SELECT DEST_ID,NAME,ARCHIVED FROM V$ARCHIVED_LOG;