您的位置:首页 > 数据库 > Oracle

Oracle 10g数据库学习专题

2015-02-03 10:44 204 查看
 Oracle 10g数据库
安装
全局数据库名可以使用.com.cn等后缀
安装完成后显示C:\oracle\product\10.1.0\Db_2\database\SPFILE***.ora为参数文件
其中的“***”表示数据库的实例名,即SID
体系结构(物理结构、文件系统)
SID:C:\oracle\product\10.1.0\oradata\***\
CONTROL01.CTL等三个是控制文件,由database load启动
REDO01.log等三个是联机日志文件
SYSTEM01.DBF是数据文件,由database open启动
cmd
sqlplus "sys/test1234 as sysdba"
查看控制文件
SQL>DESC v$controlfile
SQL>SELECT status,name FROM v$controlfile;
查看数据文件
SQL>DESC v$datafile
SQL>SELECT file#,status FROM v$datafile;
查看日志文件
SQL>DESC v$logfile
SQL>SELECT member FROM v$logfile;
参数文件:C:\oracle\product\10.1.0\Db_2\database\SPFILE***.ORA
用于指定控制文件的路径
ORACLE物理结构(文件系统):通过参数文件寻找到控制文件,再由控制文件控制和管理数据文件和日志文件.

内存结构
SGA:DB buffer、大共享区、共享池、Redo buffer、固定SGA
其中
DB buffer:包括 默认缓存池、保持缓存池、再生缓存池:频繁访问的大表使用
通过buffer pool keep和buffer pool reseleq
来对缓冲池进行设置
共享池:包括库缓存区和系统缓存区,其中库缓存区包括共享SQL区和PL/SQL区
Redo buffer
大共享区:非必选,在多线程系统可以用它来做备份程序

逻辑结构:
以表空间为中心,一个表空间右边对应多个数据文件,左边对应多个段,每个段对应多个盘区,每个盘区又对应多个块
每个块必须是操作系统中磁盘分块的整数倍,默认为8K
段与数据文件之间不存在一一对应的关系

第二章SQL*PLUS
cmd
c:\>sqlplus "sys/test1234 as sysdba"
如实例未打开则:
c:\>sqlplus/nolog
SQL>connect sys/test1234 as sysdba
三种启动实例的命令:
SQL>startup 启动实例,控制文件和数据文件
SQL>startup mount 启动实例,控制文件,不启动数据文件
SQL>startup nomount 启动实例,不打开控制文件,用于控制文件丢失的情况下
查看归档状态:
SQL>archive log list
以下把数据库的非归档方式改为归档方式
SQL>startup mount
SQL>alter database archivelog
SQL>alter database open
关闭数据库:
SQL>shutdown 正常关闭
SQL>shutdown immediate 迫使当前每个用户执行完SQL语句后立即断开,终止实例,
SQL>shutdwon transactional 迫使用户在当前执行完成后断开连接,终止实例
恢复破坏的文件,数据文件,不能同其它的数据库文件保持一致
SQL>shutdown about 强行关闭数据库,关闭实例,很可能造成文件的破坏

在IE浏览器中:http://hostname:5560/isqlplus
命令:执行,加载,保存脚本

SQL>help index 查询所有命令
SQL>? SET 查询某个命令(如:SET)的详细信息及用法
SQL>SET SQLBLANKLINES ON 支持空行的输入
SQL>SELECT * FROM dept WHERE deptno=&tt; 替换变量的支持
在程序中使用替换变量,可以减少ORACLE的执行计划

SQL>LIST 列出缓冲区中的所有命令内容
SQL>l1 列出缓冲区中第一行的命令内容
SQL>l3 列出缓冲区中第三行的命令内容
SQL>c/FRON/FROM 替换缓冲区中的命令中的某些字符
SQL>c/N/M
SQL>/ 执行缓冲区中的命令
SQL>DEL 4 删除缓冲区中的第4行命令内容
SQL>DEL 2 3 删除缓冲区中第2行到第3行命令内容
SQL>A FROM dept 追加到缓冲区末
SQL>save c:\oracle\test.txt 保存缓冲区中的命令到文件中
SQL>@c:\oracle\test.txt 执行文件中的命令
SQL>get c:\oracle\test.txt 查看文件中的命令内容
SQL>edit 用记事本打开缓冲区中的SQL命令语句
SQL>COL deptno HEADING "编号" 设置表中某列的标签
SQL>SELECT * FROM dept;
SQL>DESC dept 查看表中字段的数据类型信息
SQL>COL dname FORMAT A10 格式化字段,以10个字符形式输出
SQL>COL dname FORMAT A10 HEADING "部门名称"
格式化字段并设置字段的标签
设置的字段的标签仅对当前用户的当前会话起作用
SQL>COL deptno FORMAT 999,999,999 格式化整型字段的显示
SQL>connect "sys/test1234 as sysdba"
SQL>SELECT bytes FROM v$datafile;
SQL>COL bytes FORMAT 999,999,999
SQL>SELECT bytes FROM v$datafile;

SQL>connect scott/tiger
SQL>SELECT * FROM dept;
对标题设置一些报表:
SQL>SET LINESIZE 50
设置行宽
SQL>TTITLE CENTER "我的标题" SKIP 1-
>LEFT "测试报表" RIGHT "页" -
>FORMAT 999 SQL.PNO SKIP 2
设置标题(报表头)
SQL>SELECT * FROM dept;
SQL>TTITLE OFF
关掉报表头

制作报表的两个非常有用的命令:
SQL>BREAK
SQL>COMPUTE

SQL>SELECT * FROM books;
SQL>BREAK ON pub
SQL>SELECT * FROM books;
重复两行
SQL>COMP COUNT LABEL "计数" OF books_name ON pub
用COMP做统计工作
SQL>SELECT * FROM pub;

SQL>spool c:\oracle\spool.txt
保存查询出来的结果集数据
SQL>SELECT * FROM books;
SQL>spool off
SQL>edit c:\oracle\spool.txt

第三章SQL语言
SQL>connect scott/tiger
SQL>CREATE TABLE abc(a varchar2(10),b char(10));
SQL>ALTER TABLE abc ADD c number;
SQL>DROP TABLE abc
SQL>ALTER TABLE abc DROP COLUMN c;删除表abc的字段c

SQL>connect tt/tt11
SQL>SELECT * FROM scott.dept;
无授权

SQL>conn scott/tiger
SQL>GRANT SELECT ON dept TO tt;授权表dept的查询操作给tt

SQL>REVOKE SELECT ON dept FROM tt;收回tt的查询操作在表dept上

SQL>INSERT INTO abc(a,b) VALUES('abc','xy');
表中只有两个字段,且都要赋值时,abc后的括号可以省略
SQL>INSERT INTO abc VALUE('bcd','123');
修改记录:
SQL>UPDATE abc SET b='ttt';b列值全改为ttt
SQL>UPDATE abc SET b='YYY' WHERE a='abc';
修改某行的某字段值

SQL>DELETE FROM abc;删除表中所有记录
SQL>DELETE FROM abc WHERE a='abc';删
4000
除某一行记录

常用字系统函数
字符:
SQL>SELECT LENGTH('ABCDEF') FROM dual;
返回6
SQL>SELECT LENGTH('AB好DEF') FROM dual;
返回6
SQL>SELECT LENGTHB('AB好DEF') FROM dual;
返回7
SQL>SELECT LTRIM(' ABC好EF') FROM dual;
SQL>SELECT LENGTH(LTRIM(' ABC好EF')) FROM dual;
返回值为6
RTRIM
TRIM

VARCHAR2为可变长字符串类型(写不满时不补空格)
CHAR为定长字符串类型(写不满时右边补空格)

SQL>SELECT SUBSTR('abcdefg',2,3) FROM dual;
取出串里的字符串
左取串:
SQL>SELECT SUBSTR('abcdefg',1,3) FROM dual;
右取串:
SQL>SELECT SUBSTR('abcdefg',LENGTH('abcdefg')-3+1,3) FROM dual;

SQL>SELECT sysdate FROM dual;
查看当前数据库所在的服务器的机器的时间
SQL>ALTER SESSION SET NLS_DATE_FORMAT='dd-mon-yyyy hh:mi;ss';
SQL>设置时间格式
SQL>SELECT CURRENT_DATE FORM dual;
SQL>得到给定时间之后的星期几的日期
SQL>SELECT NEXT_DAY(sysdate,'星期三') FROM dual;
SQL>SELECT sysdate FROM dual;
SQL>SELECT TO_CHAR(sysdate,'yyyy-mm-dd') FROM dual;
SQL>SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') FROM dual;
SQL>SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM dual;
SQL>SELECT TO_DATE('12-3月-04') FROM dual;
SQL>
SQL>SELECT TO_NUMBER('333') FROM dual;
SQL>
SQL>SELECT TO_NUMBER('000333') FROM dual;
SQL>
SQL>聚集函数
SQL>SELECT * FROM books;
SQL>SELECT max(price) FROM books;
SQL>SELECT min(price) FROM books;
SQL>SELECT sum(price) FROM books;
SQL>SELECT avg(price) FROM books;
SQL>SELECT count(price) FROM books;
SQL>SELECT count(*) FROM books;
SQL>当表中某字段允许空值时,查询的此表的行数与此字段的行数就有可能不一样
SQL>SELECT * FROM books WHERE price>20;
SQL>聚集函数不能和WHERE语句结合
SQL>
SQL>其他函数
SQL>SELECT user FROM dual;
SQL>返回scott
SQL>connect tt/tt11
SQL>SELECT user FROM dual;
SQL>返回TT
SQL>connect scott/tiger
SQL>SELECT * FROM e;
SQL>SELECT SUM(DECODE(SEX,'男',1,0)) 男人数,SUM(DECODE(SEX,'女',1,0)) 女人数 FROM e;
SQL>
SQL>SELECT * FROM aa;
SQL>对空值进行判断
SQL>SELECT a1,nvl(a2,'未输入') a2 FROM aa;
SQL>
SQL>SELECT * FROM aa WHERE a2 IS NULL;
SQL>SELECT * FROM aa WHERE a2 IS NOT NULL;
SQL>SELECT * FROM aa;
SQL>SELECT * FROM aa ORDER BY a1 ASC;
SQL>排序
SQL>SELECT * FROM aa ORDER BY a1 DESC;
SQL>重复数据只显示一条
SQL>SELECT DISTINGT a1 FROM aa;
SQL>
SQL>SELECT * FROM books;
SQL>分组语句
SQL>SELECT sum(price*qty) FROM books;
SQL>SELECT sum(price*qty) FROM books group BY pub;
SQL>
SQL>SELECT pub,sum(price*qty) FROM books GROUP BY pub;
SQL>前面选择的列和后面的分组的一定要一致。
SQL>后面的分组的列可以多于前面选择的列
SQL>SELECT pub,sum(price*qty) FROM books GROUP BY pub,books_name;
SQL>SELECT pub,books_name,sum(price*qty) FROM books WHERE price>30 GROUP BY pub;
SQL>SELECT pub,sum(price*qty) FROM books WHERE sum(price)>30 GROUP BY pub;
SQL>会出错,因为聚集函数不能在WHERE中使用
SQL>解决办法是使用HAVING子句:
SQL>SELECT pub,sum(price*qty) FROM books GROUP BY pub HAVING sum(price)>30;
SQL>使用HAVING子句时,GROUP BY一定要放到HAVING子句的前面
SQL>
SQL>查询aa表中a1字段有哪些重复
SQL>SELECT a1,count(a1) FROM aa GROUP BY a1 HAVING count(a1)>1;
SQL>
SQL>模糊查询
SQL>查询出aa表中a1字段以a开头,以单个字符结尾的行
SQL>SELECT * FROM aa WHERE a1 LIKE 'a_';
SQL>
SQL>SELECT * FROM aa WHERE a1 LIKE 'a%';
SQL>SELECT * FROM aa WHERE a1 LIKE '%a';
SQL>SELECT * FROM aa WHERE a1 LIKE '%a%';
SQL>SELECT * FROM e WHERE ename LIKE '张';
SQL>SELECT * FROM e WHERE ename LIKE '张%';
SQL>SELECT * FROM e WHERE ename LIKE '赵%';
SQL>
SQL>表的联接
SQL>SELECT eid 编号,ename 姓名,sex 性别,ID 所在部门 FROM e;
SQL>SELECT eid 编号,ename 姓名,sex 性别,id 所在部门 FROM e,d WHERE e.id=d.id;
SQL>报错,无法定位部门编号是哪个
SQL>SELECT eid 编号,ename 姓名,sex 性别,d.name 所在部门 FROM e,d WHERE e.id=d.id;
SQL>叫做表的内联接
SQL>标准写法:
SQL>SELECT eid 编号,ename 姓名,sex 性别,d.name 所在部门 FROM e JOIN d ON e.id=d.id;
SQL>
SQL>外联接(左外联接,右外联接)
SQL>左联接
SQL>SELECT eid 编号,ename 姓名,sex 性别,d.name 所在部门 FROM e JOIN d ON e.id=d.id(+);
SQL>右联接
SQL>SELECT eid 编号,ename 姓名,sex 性别,d.name 所在部门 FROM e JOIN d ON e.id(+)=d.id;
SQL>
SQL>子查询
SQL>无关子查询
SQL>SELECT * FROM e WHERE id IN (SELECT id FROM d);
SQL>相关子查询
SQL>SELECT * FROM e WHERE id IN (SELECT id FROM d WHERE id=e.id AND id='03');
SQL>SELECT * FROM e WHERE id NOT IN (SELECT id FROM d WHERE id=e.id AND id='03');
SQL>子查询中的选择不能用*,一定要用父查询需要的那个字段
SQL>SELECT * FROM e WHERE EXISTS (SELECT id FROM d);(无关子查询)
SQL>SELECT * FROM e;
SQL>SELECT * FROM e WHERE EXISTS (SELECT id FROM d WHERE id=e.id);(相关子查询)
SQL>SELECT * FROM e WHERE NOT EXISTS (SELECT * FROM d WHERE id=e.id);
SQL>用EXISTS时后面的子查询里可以用*
SQL>当子查询和表连接都能实现时,先选择表连接来实现。
SQL>当表连接实在无法实现时,再用子查询来实现。
SQL>
SQL>合并两个表的行
SQL>SELECT eid,ename FROM e UNION select id,name FROM d;
SQL>SELECT id FROM e UNION SELECT id FROM d;
SQL>使用UNION合并行数据
SQL>
SQL>INTERSECT可以选择出两个表中都出现的行
SQL>SELECT id FROM e INTERSECT SELECT id FROM d;
SQL>
SQL>在表中插入多条记录
SQL>INSERT INTO e(eid,ename) SELECT id,name FROM d;
SQL>把另外一个表的结果集写入到一个表中
SQL>
SQL>CREATE TABLE ttt AS (SELECT * FROM e);
SQL>复制表e中的所有记录到新建的ttt表中
SQL>CREATE TABLE t AS SELECT eid,ename FROM e WHERE eid='001';
SQL>
SQL>
SQL>

第四章 PL/SQL基础
PL/SQL块结构:
DECLARE
……
BEGIN
……
EXCEPTION
……
END;
/
变量声明:
变量名,数据类型,标准变量与复合变量(记录),控制变量的范围
命名规范:
变量由字符开头,后面包含数字、下划线、$、#等
变量长度小于30
大小写不区分
变量名不能是系统关键字
变量名要有意义

SQL>DECLARE
SQL>x varchar2(10);
SQL>BEGIN
SQL>x:='This is..';
SQL>DBMS_OUTPUT.PUT_LINE('x的值为 '||x);两竖线可以连接不同类型的变量
SQL>END;
SQL>/
SQL>SET SERVEROUTPUT ON SIZE 10000
SQL>L
SQL>返回:x的值为 This is..
SQL>save c:\plsql_01.txt
SQL>可以不用PUT_LINE,而用PUT
SQL>但PUT使用必须在后面加上NEW_LINE
SQL>行注释:==
SQL>块注释:
SQL>声明变量时,赋初值
SQL>x varchar2(10):='ABCD';
SQL>表中的字段声明不可以用INTEGER一类的类型只能用NUMBER
SQL>但在PL/SQL中声明的一般变量,可以声明为INTEGER类型
SQL>y INTEGER:=123;
SQL>y STRING(10):='123';
SQL>STRING必须指定长度
SQL>
SQL>分支语句
SQL>IF a=1 THEN
SQL>赋值时等号前加冒号,判断时等号前没有冒号
SQL>
SQL>DECLARE
SQL>a number;
SQL>b varchar2(10);
SQL>BEGIN
SQL>a:=2;
SQL>IF a=1 THEN
SQL>b:='A';
SQL>ELSEIF a=2 THEN
SQL>b:='B';
SQL>ELSE
SQL>b:='C';
SQL>END IF;
SQL>DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
SQL>END;
SQL>/
SQL>输出:b的值是:B
SQL>
SQL>CASE分支
SQL>CASE
SQL>WHEN a=1 THEN b:='A';
SQL>WHEN a=2 THEN b:='B';
SQL>WHEN a=3 THEN b:='C';
SQL>ELSE
SQL>b:='Others';
SQL>END CASE
SQL>
SQL>循环语句
SQL>LOOP
SQL>……
SQL>END LOOP
SQL>WHILE expression LOOP
SQL>……
SQL>END LOOP
SQL>FOR counter IN[REVERSE] start_value..end_value LOOP
SQL>……
SQL>END LOOP
SQL>
SQL>DELCARE
SQL>x number;
SQL>BEGIN
SQL>x:=0;
SQL>LOOP
SQL>x:=x+1;
SQL>IF x>=3 THEN
SQL>EXIT;
SQL>END IF;
SQL>DBMS_OUTPUT.PUT_LINE('内:x='||x);
SQL>END LOOP
SQL>DBMS_OUTPUT.PUT_LINE('外:x='||x);
SQL>END;
SQL>/
SQL>
SQL>save c:\plsql_loop01.txt
SQL>edit c:\plsql_loop01.txt
SQL>另存为plsql_loop02.txt
SQL>EXIT WHEN x>=3;
SQL>等效于
SQL>IF x>=3 THEN
SQL>EXIT;
SQL>END IF;
SQL>
SQL>DECLARE
SQL>x number;
SQL>BEGIN
SQL>x:=0;
SQL>WHILE x<=3 LOOP
SQL>x:=x+1;
SQL>DBMS_OUTPUT.PUT_LINE('内:'||x);
SQL>END LOOP
SQL>DBMS_OUTPUT.PUT_LINE('外:'||x);
SQL>END;
SQL>/
SQL>
SQL>BEGIN
SQL>FOR i IN 1..5 LOOP
SQL>DBMS_OUTPUT.PUT_LINE('i='||i);
SQL>END LOOP;
SQL>DBMS_OUTPUT.PUT_LINE('END OF FOR LOOP');
SQL>END;
SQL>/
SQL>
SQL>IN REVERSE由大到小循环
SQL>
SQL>使用GOTO语句进行循环
SQL>DECLARE
SQL>x number;
SQL>BEGIN
SQL>x:=0;
SQL><<repeat_loop>>
SQL>x:=x+1;
SQL>DBMS_OUTPUT.PUT_LINE(x);
SQL>IF x<3 THEN
SQL>GOTO repeat_loop;
SQL>END IF;
SQL>END;
SQL>/
SQL>
SQL>异常处理(系统异常,程序异常)
SQL>DECLARE
SQL>test varchar2(10);
SQL>BEGIN
SQL>SELECT name INTO test FROM deptment WHERE id='tt';
SQL>DBMS_OUTPUT.PUT_LINE(test);
SQL>EXCEPTION
SQL>WHEN NO_DATA_FOUNT THEN
SQL>DBMS_OUTPUT.PUT_LINE('没有找到数据');
SQL>END;
SQL>/
SQL>
SQL>自定义异常
SQL>DECLARE
SQL>tname varchar2(10);
SQL>e exception;
SQL>BEGIN
SQL>SELECT name INTO tname FROM deptment WHERE id='01';
SQL>IF tname<>'B部门' THEN
SQL>RAISE e;
SQL>END IF;
SQL>DBMS_OUTPUT.PUT_LINE(tname);
SQL>EXCEPTION
SQL>WHEN e THEN
SQL>DBMS_OUTPUT.PUT_LINE('错误,不是需要的B部门!');
SQL>END;
SQL>/
SQL>
SQL>复合变量:记录
SQL>DECLARE
SQL>TYPE myrecord IS RECORD(
SQL>id varchar2(10),
SQL>name varchar2(10));
SQL>real_record myrecord;
SQL>BEGIN
SQL>SELECT eid,ename INTO real_record FROM emp WHERE eid='001';
SQL>DBMS_OUTPUT.PUT_LINE(real_record.id ||','||real_record.name);
SQL>END;
SQL>/
SQL>DESC
12999
emp
SQL>
SQL>使定义的记录的变量的数据类型与表中的相应的列的数据类型及长度一致
SQL>id emp.eid%TYPE
SQL>使定义的记录的所有变量的数据类型与表中的所有列的数据类型及长度一致
SQL>myrec emp%ROWTYPE;
SQL>BEGIN
SQL>SELECT * INTO myrec FROM emp WHERE eid='001';
SQL>DBMS_OUTPUT.PUT_LINE(myrec.eid||','||myrec.ename||','||myrec.sex);
SQL>END;
SQL>/

第五章 PL/SQL高级应用
游标
显式、隐式
由游标结果集及结果集中数据的位置来组成
属性:%FOUND %ISOPEN %NOTFOUND %ROWCOUNT
SQL>DECLARE
2 CURSOR mycur IS
3 SELECT * FROM books;
4 myrecord books%ROWTYPE;
5 BEGIN
6 OPEN mycur;
7 FETCH mycur INTO myrecord;
8 WHILE mycur%FOUND LOOP
9 DBMS_OUTPUT.PUT_LINE(myrecord.books_id||','||myrecord.books_name);
10 FETCH mycur INTO myrecord;
11 END LOOP;
12 CLOSE mycur;
13 END;
14 /
SQL>save c:\plsql_cursor01.txt
SQL>DECLARE
2 CURSOR cur_para(id varchar2) 定义游标的参数不用定义其长度,给出数据类型即可
3 SELECT books_name FROM books WHERE books_id=id;
4 t_name books.books_name%TYPE;
5 BEGIN
6 OPEN cur_para('0001');
7 LOOP
8 FETCH cur_para INTO t_name;
9 EXIT WHEN cur_para%NOTFOUND;
10 DBMS_OUTPUT.PUT_LINE(t_name);
11 END LOOP;
12 CLOSE cur_para;
13 END;
14 /
SQL>save c:\plsql_curso03.txt

SQL>DECLARE
2 CURSOR cur_para(id varchar2) IS
3 SELECT books_name FROM books WHERE books_id=id;
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE('*******结果集为:********');
6 FOR cur IN cur_para('0001') LOOP 使用FOR循环用游标读记录时,最后游标不用关
7 DBMS_OUTPUT.PUT_LINE(cur.books_name);
8 END LOOP;
9 END;
10 /

SQL>DECLARE
2 t_name books.books_name%TYPE;
3 CURSOR cur(id varchar2) IS
4 SELECT books_name FROM books WHERE books_id=id;
5 BEGIN
6 IF cur%ISOPEN THEN
7 DBMS_OUTPUT.PUT_LINE('游标已经被打开!');
8 ELSE
9 OPEN cur('0003');
10 END IF;
11 FETCH cur INTO t_name;
12 CLOSE cur;
13 DBMS_OUTPUT.PUT_LINE(t_name);
14 END;
15 /

SQL>DECALRE
2 t_name varchar2(10);
3 CURSOR mycur IS
4 SELECT name FROM deptment;
5 BEGIN
6 OPEN mycur;
7 LOOP
FETCH mycur INTO t_name;
8 EXIT WHEN mycur%NOTFOUND OR mycur%NOTFOUND IS NULL;
9 DBMS_OUTPUT.PUT_LINE('游标mycur的ROWCOUNT是:'||mycur%ROWCOUNT);
10 END LOOP;
11 CLOSE mycur;
12 END;
13 /
使用游标修改数据:
SQL>DECLARE
2 CURSOR cur IS
3 SELECT name FROM deptment FOR UPDATE;
4 text varchar2(10);
5 BEGIN
6 OPEN cur;
7 FETCH cur INTO text;
8 WHILE cur%FOUND LOOP
9 UPDATE deptment SET name=name||'_t' WHERE CURRENT OF cur;
10 FETCH cur INTO text;
11 END LOOP;
12 CLOSE cur;
13 END;
14 /
SQL>SELECT * FROM deptment;

隐式游标:
SQL>BEGIN
2 FOR cur IN(SELECT name FROM deptment) LOOP
3 DBMS_OUTPUT.PUT_LINE(cur.name);
4 END LOOP;
5 END;
6 /

当数据量大时,不建议使用游标,效率不高

存储过程、存储函数、包、触发器
存储过程:
1。定义部分
2。声明部分
3。执行部分

SQL>CREATE OR REPLACE PROCEDURE myproc(id IN varchar2)
2 IS
3 name varchar2(10);
4 BEGIN
5 SELECT books_name INTO name FROM books WHERE books_id=id;
6 DBMS_OUTPUT.PUT_LINE(name);
7 END myproc;
8 /

SQL>save c:\plsql_proc01.txt
查询编译错误:
SQL>SHOW ERRORS PROCEDURE myproc;
执行过程
SQL>DECLARE
2 tid varchar2(10);
3 BEGIN
4 tid:='0001';
5 myproc(tid);
6 END;
7 /

SQL>BEGIN
2 myproc('0001');
3 END;
4 /
用执行语句时,过程必须无参数或只有输入参数且输入参数为常量
SQL>EXECUTE myproc('0001');

使用输出参数:
SQL>CREATE OR REPLACE PROCEDURE myproc2(id varchar2,name OUT varchar2)
2 IS
3 BEGIN
4 SELECT books_name INTO name FROM books WHERE books_id=id;
5 END;
6 /
SQL>save c:\plsql_proc02.txt
SQL>DECLARE
2 tid varchar2(10);
3 tname varchar2(10);
4 BEGIN
5 tid:='0001';
6 myproc2(tid,tname);
7 END;
8 /

第六章
视图
将复杂的查询语句封装成视图,视图与表的操作相同,但视图比表要快
作用:安全,方便,一致性
SQL>CREATE OR REPLACE VIEW myview
2 AS
3 SELECT * FROM books;
SQL>SELECT * FROM myview;
SQL>INSERT INTO myview(books_id) VALUES('0008');

SQL>CREATE OR REPLACE VIEW myview
2 AS
3 SELECT * FROM books WHERE price>30;

SQL>save c:\view01.txt
SQL>SELECT * FROM myview;

SQL>INSERT INTO myview VALUES('0009','ABCDE',23.5,'AA');
SQL>SELECT * FROM books;
SQL>SELECT * FROM myview;

CREATE OR REPLACE VIEW myview
AS
SELECT * FROM books WHERE price>30
WITH CHECK OPTION
/

SQL>CREATE OR REPLACE VIEW v_emp_dept
2 AS
3 SELECT eid,ename,sex,d.id,d.name FROM emp e,deptment d WHERE e.id=d.id;

SQL>SELECT * FROM v_emp_dept;
SQL>INSERT INTO v_emp_dept VALUES('007','ABC','M','33','II');
视图中,不可同时对两个或两个以上的基表进行更新

只读视图
SQL>CREATE OR REPLACE VIEW v_read
2 AS
3 SELECT eid,ename FROM emp
4 WITH READ ONLY;
SQL>SELECT * FROM v_read;
SQL>DELETE FROM v_read WHERE eid='005';

SQL>DESC dba_views
SQL>DESC all_views
SQL>DESC user_view
查看视图的语法信息文本
SQL>SELECT text FROM user_view WHERE view_name='v_read';

同义词
一个对象的替代名字,使多个用户使用同一个对象,而不用将模式作为前缀放在对象的前面.
一般情况下,一个用户模式下访问另外一个用户模式下的对象的时候,应该把另外用户的名称放在前边作为前缀,否则是不支持的。
SQL>SELECT user FROM dual;
SQL>SELECT * FROM dept;
SQL>SELECT * FROM scott.dept;
公共同义词和私有同义词
SQL>CREATE SYNONYM dept FOR scott.dept;
SQL>SELECT * FROM dept;
SQL>connect tt/tt11
SQL>SELECT * FROM dept;

SQL>connect sys/test1234 as sysdba
SQL>DROP SYNONYM dept;
SQL>CREATE PUBLIC SYNONYM dept FOR scott.dept;
SQL>SELECT * FROM dept;

SQL>connect tt/tt11
SQL>SELECT * FROM dept;

使用同义词的情况:
应用程序的开发者为了缩写他们在SQL代码开发期间经常需要引用的表,这种方法避免了重复敲一长串名字。公共同义词简化了应用程序的迁移。如果模式名字不同而表相同,那么同义词允许程序很容易地从一个数据库迁移到另外一个数据库。有时候使用公共同义词是为了查找让所有数据库用户都需要的共同的表。数据字典中的DBA视图的同义词提供了这种使用的很好的例子。
使两个应用程序用不同的名字指向同一个表。

SQL>DESC dba_synonyms
SQL>CONNECT tt/tt11
SQL>CREATE SYNONYM dep FOR scott.dept;
SQL>SELECT * FROM dept;
SQL>DESC user_synonyms

SQL>SELECT synonym_name,table_name,table_owner FROM user_synonyms;

序列
序列是用于发布一唯一数字整型的ORACLE对象。它是一个独立型的事务。当每次访问一个序列的时候,这个序列的值,按照一个事先规定的增量增加或减少,是自动完成的。当我们提交或回滚一个事务,不影响序列的变化,它能够被存储到数据库当中,但是不能象表一样占用很多空间,这可以通过关闭和启动来维持和维护我们的序列。经常用于产生一些唯一值,比如一些整型字段需要自增,我们可以充分地利用序列。
创建序列的语法方式:
SQL>CREATE SEQUENCE myseq
2 START WITH 1
3 INCREMENT BY 1
4 ORDER
5 NOCYCLE;

SQL>SELECT myseq.NEXTVAL FROM dual;
...
...

SQL>SELECT myseq.CURRVAL FROM dual;
NOCYCLE在一定程度会影响到性能。
在内存中缓存值不大。
SQL>CREATE TABLE auto(a number,b varchar2(10));
SQL>INSERT INTO auto VALUES(myseq.NEXTVAL,'dfd');
...
...

SQL>SELECT * FROM auto;
SQL>DESC dba_sequences
查询序列信息

SQL>SELECT sequence_name,sequence_owne FROM dba_sequences
2 WHERE sequence_owner='TT';

SQL>SELECT user FROM dual;

SQL>ALTER SEQUENCE myseq
2 INCREMENT BY 3;

SQL>SELECT myseq.nextval FROM dual;
...

第七章 触发器的设计
可以把触发器看成一个过程。
触发器是自动运行,自动完成的。
拥有声明、执行和异常处理过程的带名的PLSQL的语句块。与包也类似,必须存储在数据库中,并且不能对块进行本地化的声明。
当定义的事件发生时,就会显式地调用触发器。
触发器不接收参数,这一点与视图相似
维护表的强制的完整性的约束限制。
数据操纵源触发器,数据定义源触发器,系统触发器
数据操作源触发器里包含行级触发器,语句级的触发器,替换触发器

触发器进行触发的事件,发生事件的对象。
控制触发器何时触发的条件,执行触发器的语句体

事务:确保数据完整性和并发处理的能力。用于保障语句都成功/失败
A原子性、C一致性、I隔离性、D永久性
Atomicity,Consistency,Isolation,Durability
SQL>CREATE OR REPLACE TRIGGER del_deptid
2 AFTER DELETE ON deptment
3 FOR EACH ROW '行触发
4 BEGIN
5 DELETE FROM emp WHERE id=:old.id;
6 END del_deptid;
7 /
SQL>save c:\trigger01.txt

SQL>DELETE FROM deptment WHERE id='01';
SQL>SELECT * FROM deptment;
SQL>SELECT * FROM emp;

SQL>rollback;
SQL>SELECT * FROM deptment;
SQL>SELECT * FROM emp;

SQL>CREATE OR REPLACE TRIGGER insert_dept
2 AFTER INSERT ON deptment
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO emp(eid,ename,id) VALUES('121','QWERT',:new.id);
6 END;
7 /
SQL>save c:\trigger02.txt

SQL>INSERT INTO deptment VALUES('77','GHJ');

SQL>SELECT * FROM depement;
SQL>SELECT * FROM emp;

关于old和new表:内存中的两张表.
old new
INSERT - Y
DELETE Y -
UPDATE Y Y

SQL>CREATE OR REPLACE TRIGGER update_dept
2 AFTER UPDATE ON deptment
3 FOR EACH ROW
4 BEGIN
5 UPDATE emp SET id=:new.id WHERE id=:old.id
6 END;
7 /
SQL>save c:\trigger03.txt
SQL>UPDATE deptment SET id='yy' WHERE id='01';
SQL>SELECT * FROM deptment;
SQL>SELECT * FROM emp;
触发器里不可以写commit和rollback
相应的处理办法:
如不允许删除某行的触发器
SQL>CREATE OR REPLACE TRIGGER books_delete
2 AFTER DELETE ON books
3 FOR EACH ROW
4 BEGIN
5 IF :old.books_id='0001' THEN
6 RAISE_APPLICATION_ERROR(-20000,'不允许删除!');
7 END IF;
8 END;
9 /
SQL>save c:\trigger04.txt
SQL>DELETE FROM books WHERE books_id='0001';
自定义的错误号从-20999到-20000之间

语句级触发器的特点:
SQL>SELECT * FROM aa;

审计日志处理:
SQL>CREATE TABLE mylog(curr_user varchar2(100),curr_date date,act char(1));
SQL>CREATE OR REPLACE TRIGGER dml_aa
2 AFTER INSERT OR DELETE OR UPDATE
3 BEGIN
4 IF INSERTING THEN
5 INSERT INTO mylog VALUE(user,sysdate,'I');
6 ELSE DELETING THEN
7 INSERT INTO mylog VALUE(user,sysdate,'D');
8 ELSE
9 INSERT INTO mylog VALUE(user,sysdate,'U');
10 END IF;
11 END;
12 /
SQL>save c:\trigger05.txt
SQL>SELECT * FROM aa;
SQL>UPDATE aa SET a2='test' WHERE a1='cba';
SQL>DELETE FROM aa WHERE a2='dee';
SQL>INSERT INTO aa VALUES('tt','yy','uu');
SQL>SELECT * FROM mylog;
SQL>SELECT curr_user,TO_CHAR(curr_date,'yyyy-mm-dd hh24:mi:ss') D FROM mylog;
整型自增的触发器实现
SQL>SELECT * FROM auto;
SQL>SELECT myseq.NEXTVAL FROM dual;
...
SQL>CREATE OR REPLACE TRIGGER set_no
2 BEFOR INSERT ON auto
3 FOR EACH ROW
4 DECLARE
5 sn number(5);
6 BEGIN
7 SELECT myseq.nextval INTO sn FROM dual;
8 :new.a:=sn;
9 END;
10 /
SQL>save c:\trigger06.txt
SQL>INSERT INTO auto VALUES(21,'dtt');
SQL>SELECT * FROM auto;

替换触发器:
SQL>SELECT * FROM v_emp_dept;
解决多表更新的问题
SQL>INSERT INTO v_emp_dept VALUE('456','test','f','33','hg');
会出错误信息,不允许更新多个基表.
解决办法:
SQL>CREATE OR REPLACE TRIGGER tr_v_e_d
2 INSTEAD OF INSERT ON v_emp_dept
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO deptment VALUES(:new.id,:new.name);
6 INSERT INTO emp(eid,ename,sex,id) VALUES(:new.eid,:new.ename,:new.sex,:new.id);
7 END;
8 /
SQL>save c:\trigger07.txt
SQL>INSERT INTO v_emp_dept('456','text','f','33','hg');
SQL>SELECT * FROM v_emp_dept;
替换触发器只能建立在视图上.解决视图的多个基表更新的问题

第八章 安全管理
SQL>conn tt/tt11
SQL>SELECT user FROM dual;
SQL>conn tt/tt11 as sysdba
SQL>SELECT user FROM dual;
默认创建的用户仅仅有连接数据库的权限,对其他表没有任何权限.
授权:
SQL>connect sys/test1234 as sysdba
SQL>GRANT SELECT ON scott.dept TO test;
这样test用户对scott.dept表拥有查询的权限.
修改默认表空间:
SQL>conn / as sysdba
SQL>ALTER USER test DEFAULT TABLESPACE users;
SQL>ALTER USER test DEFAULT TABLESPACE tt;
修改密码
SQL>ALTER USER test IDENFIFIED BY test11;
锁定账号
SQL>ALTER USER test ACCOUNT LOCK;
解除锁定
SQL>ALTER USER test ACCOUNT UNLOCK;

创建用户:
SQL>CREATE USER qqq IDENTIFIED BY qqq123
2 DEFAULT TABLESPACE tt;
SQL>connect qqq/qqq123
连接失败.未注册
注册:
SQL>GRANT CONNECT TO qqq;
给用户授权其他用户的权限:(对象授权)
SQL>GRANT SELECT ON scott.dept TO test WITH GRANT OPTION
SQL>connect test/test11
SQL>GRANT SELECT ON scott.dept TO qqq;
SQL>connect qqq/qqq123
SQL>SELECT * FROM scott.dept;
即级联授权

完整授权:
SQL>GRANT ALL ON scott.dept TO test WITH GRANT OPTION;
过程授权:
SQL>GRANT EXECUTE ON tt.proc01 TO test;

系统授权:
SQL>conn test/test11
SQL>CREATE USER abc IDENTIFIED BY abc;
SQL>conn / as sysdba
SQL>GRANT CREATE USER TO test;
SQL>conn test/test11
SQL>CREATE USER abc IDENTIFIED BY abc;
SQL>DROP USER abc;
删除出错.

SQL>conn / as sysdba
SQL>GRANT DROP USER TO test;
SQL>conn test/test11
SQL>DROP USER abc;

SQL>conn / as sysdba
SQL>GRANT CREATE USER TO test;
SQL>conn test/test11
SQL>GRANT CREATE USER TO qqq;
授权失败.

SQL>conn / as sysdba
SQL>GRANT CREATE USER TO test WITH ADMIN OPTION;
SQL>conn test/test11
SQL>GRANT CREATE USER TO qqq;
SQL>conn qqq/qqq123
SQL>CREATE USER ty IDENTIFIED BY ty;

解除权限:
SQL>conn / as sysdba
SQL>REVOKE SELECT ON scott.dept FROM test;
SQL>REVOKE CREATE USER FROM test;

给角色授权,然后通过控制角色来控制用户的权限.
SQL>CREATE ROLE myrole;
SQL>GRANT SELECT ON tt.emp TO myrole;
SQL>GRANT SELECT ON tt.deptment TO myrole;
SQL>connect test/test11
SQL>SELECT * FROM tt.emp;
出错,无权限

SQL>conn / as sysdba
SQL>GRANT myrole TO test;
SQL>connect test/test11;
SQL>SELECT * FROM tt.emp;
SQL>connect qqq/qqq123
SQL>SELECT * FROM tt.emp;
SQL>conn / as sysdba
SQL>GRANT myrole TO qqq;
SQL>connect qqq/qqq123
SQL>SELECT * FROM tt.emp;

创建概要文件(PROFILE):
在浏览器中的OEM(Oracle Enterprise Manager)
也叫配置文件
作为通用的设置,服务\系统\CPU的使用等.
可以集中对口令进行管理,如保留的时间,允许登录的次数.
可以编辑用户使用的概要文件.

第九章 表空间的管理
一个表空间对应多个数据文件
创建表空间要有相应的创建权限
SQL>SELECT user FROM dual;
SQL>CREATE TABLESPACE tabs
2 DATAFILE 'C:\oracle\product\10.1.0\oradata\test\tabs.dbf' SIZE 10M;
创建完成
将tabs作为用户test的默认表空间
SQL>ALTER USER test DEFAULT TABLESPACE tabs;

SQL>connect test/test11
SQL>CREATE TABLE tre(t char(10),re number);
无权限

SQL>conn / as sysdba
SQL>CREATE UNLIMITED TABLESPACE ,DBA TO test;
SQL>connect test/test11
SQL>CREATE TABLE tre(t char(10),re number);
默认被创建到tabs表空间中.
指定创建到的表空间:
SQL>CREATE TABLE ty(t char(10),y varchar2(10)) TABLESPACE tt;
SQL>

第十章 表的管理
1.表的完整性和约束
保证数据的一致性\匹配性,保证数据符合我们需要的数据范围
实体完整性\域完整性\参照完整性
SQL>DESC emp
SQL>SELECT * FROM emp;
保证其编号要唯一性
SQL>INSERT INTO emp(eid,ename) VALUES('001','test22');
会报错.保证唯一性.主键强制约束constraint

域完整性,不允许向整型的字段里插入字符值.

实体完整性是通过主键来保障其记录的唯一性
SQL>CREATE TABLE nn(n1 varchar2(10) not null,n2 char(10));
SQL>INSERT INTO nn VALUES('abc','def');
SQL>INSERT INTO nn VALUES('abc','ddd');
SQL>rollback;
SQL>ALTER TABLE nn ADD CONSTRAINT pk_nn PRIMARY KEY(n1);增加主键
如果施加到单个字段上,则此字段的每条记录的值为唯一的.
如果施加到多个字段上,则这些字段的每条记录的值不能同时相同.
作为主键的字段其值不允许为空的.
SQL>INSERT INTO nn VALUES('abc','def');
SQL>INSERT INTO nn VALUES('abc','ddd');
出错.不允许插入了.

参照完整性:
SQL>SELECT * FROM nn;
SQL>CREATE TABLE mm(m1 char(10),m2 varchar2(10),n1 varchar2(10));
希望mm里的n1参数nn表里的n1.相当于部门表与员工表中的部门名称或代号的一致性.通过外键实现.
SQL>INSERT INTO mm VALUES('avd','dd','gg');
SQL>rollback;
SQL>SELECT * FROM mm;
SQL>ALTER TABLE mm ADD CONSTRAINT fk_mm FOREIGN KEY(n1) REFERENCES nn(n1);
SQL>INSERT INTO mm VALUES('avd','dd','gg');
插入出错.
参照表里的数据一定要参照被参照表里的数据.
通过在参照表里设置外键来实现.
参照表里的外键数据类型\长度一定要和被参照表里的相应的字段要一致.
被参照后,表里的数据就不能随便删除了.

CHECK约束
对于员工表的性别只有男女.不希望在这样的字段上出现其它的值.
SQL>UPDATE emp SET sex='男' WHERE eid='001';
SQL>ALTER TABLE emp ADD CONSTRAINT ck_emp_sex CHECK(sex='男' or sex='女');
SQL>UPDATE emp SET sex='M' WHERE eid='001';
出错,显示与约定的CHECK约束不符.

SQL>DESC dba_constraints
SQL>DESC all_constraints
SQL>DESC user_constraints
SQL>SELECT constraint_name,constraint_type FROM user_constraint
2 WHERE table_name='EMP';
表名作为数据值被使用时,一定要大写.
SQL>desc emp
非空字段一般也作为一种约束.

管理索引
通过索引的手段提高查询的速度.
索引是建立在表上,也可以说建立在表的字段上.
不建索引时,数据是成堆存放的.
建了索引后,会被以索引的形式存放的.
创建索引:
SQL>CREATE INDEX my_mm_idx ON mm(m1);
创建成功
SQL>SELECT i FROM mm WHERE m1='abc';
位图索引:
SQL>SELECT * FROM emp;
SQL>CREATE bitmap INDEX bit_emp ON emp(sex);
SQL>CREATE UNIQUE INDEX myidx ON mm(m2);

第十一章 SQL*Loader的使用
可从逗号分隔的文件中读记录,可以从固定长度的文件中读记录
c:\sqlldr
必选参数:
userid control data
可选参数:
log bad

用记事本写:
abc,xyz
def,qqq
fff,ggg
保存为c:\loader.txt
记事本中写控制文件:
load data
infile 'c:\loader.txt' 加载数据文件名
append 追加到表
into table mm( 或scott.emp
m1 position(1:3) char,
m2 position(5,7) char)
保存为c:\cont.ctl
c:\sqlldr tt/tt11 control=c:\cont.ctl data=c:\loader.txt

c:\>sqlplus tt/tt11
SQL>SELECT * FROM mm

如果数据文件中每个字段的长度不确定,则控制文件改为:
m1 char terminated by ",",
m2 char terminated by ",")

c:\>sqlldr tt/tt11 control=c:\cont.ctl data=c:\loader.txt

c:\>sqlplus tt/tt11
SQL>select * FROM mm;

第十二章 OEM的配置
在浏览器中登录到OEM http://localhost:5500/em 使用sys登录时,一定是用SYSDBA的身份登录

第十三章 监听程序及服务的配置
1521监听默认端口
OracleOraDb10g_home1TNSListener

启动和停止监听:
C:\>lsnrctl status
C:\>lsnrctl start
c:\>lsnrctl stop
开始菜单下的Oracle程序组中选择:
Net Manager

在左边的"监听程序"上右键"配置",写监听名,右边点"添加地址",端口号要改.
C:\>lsnrctl start listener1

c:\oracle\product\10.1.0\db_2\network\admin下可以打开listener.ora
里面记录了刚才创建的监听.
可以在tnsnames.ora里可以配置本地的服务名
在开始菜单中,选择Net Configuration Assistant,可以配置监听程序和本地服务名.测试,"更改登录".将本地服务名改为ora
SQL>connect tt/tt11@ora

第十四章 数据库备份与恢复
逻辑备份EXP和物理备份.
逻辑恢复IMP

逻辑备份形成的文件称为转储文件,扩展名为.DMP

把整个表从一个数据库移动到另一个数据库中.
可以导出整个数据库,还可以导出某个表中的某列数据.
C:\>exp tt/tt11@test
输入获取数据的缓冲区的大小.可以按默认
导出的数据文件名,可以按默认或写完整的路径.
选择是要导出整个数据库,还是用户模式还是某个表.
要导出当前用户下的一个表,输入t
是不是要导出数据,写yes
要不要压缩,写yes
导出表不是相关的分区.这里可以输入表名:emp
按回车退出,或继续写其他的表名.
验证:
在另外一个窗口,
c:\>sqlplus "tt/tt11"
SQL>DELETE FROM emp;
SQL>COMMIT;
SQL>SELECT * FROM emp;
数据已经被删除.
现在在第一个窗口中进行恢复:
c:\>imp tt/tt11
输入要恢复的数据文件名>c:\mybak.dmp
输入缓冲区大小,按默认.
列表内容是不是包含重要的文件,
是不是要忽略创建语句,是.
导入数据,是
导入整个文件,是
数据就会被恢复了.
在第二个窗口可以查找一下,数据已经在了.

物理备份分为冷备份和热备份.
冷备份即脱机备份,停掉服务器.
热备份即联机备份,不用停服务器.
SQL>shutdown immediate
复制c:\oracle\product\10.1.0\oradata\test下所有文件到备份目录中.
然后再重新启动服务.
只有管理员有权限使用shutdown immediate

热备份:
先要把服务置为归档方式,查看当前是否采用了归档方式用:
SQL>archive log list;
SQL>
在数据库中系统文件夹下有日志文件:REDO01.LOG 等.
使用非归档方式时,三个REDO文件写满后会自动地去从第一个又开始写.
把第一个REDO里的内容都覆盖掉,不做备份.这就是非归档模式
在热备份的方式下,一定要设为归档方式,所谓归档方式就是在第一个被覆盖之前,把原来里面的所有的内容都备份到一个指定的路径下.以便于以后我们要恢复时,使用备份的归档日志进行恢复.所以日志文件分为两类,一类是实例名目录下的联机的REDO01.LOG等三个文件,再有就是我们选择归档后,形成的归档日志文件.
归档日志一定要处理归档方式,就是Archive Mode,而不是No Archive Mode
归档的路径默认在我们的数据库系统的USE_DR_RECOVERY_FILE_DEST路径下.

所以我们要进行热备份时,要选择归档,如下设置:
把归档方式改为启用,自动的.
SQL>ALTER system SET log_archive_start=true scope=spfile
SQL>shutdown immediate
SQL>startup mount 打开控制文件,不打开数据文件
SQL>alter database archivelog 将数据库切换到归档方式
SQL>ALTER database open;
SQL>archive log list;
这样就启用了归档方式.
SQL>alter tablespace tt begin backup;备份表空间中的TT表空间
复制test目录下的tt.dbf到其他路径下.
SQL>alter tablespace tt END BACKUP;
SQL>ALTER SYSTEM archive log CURRENT;
SQL>ALTER SYSTEM SWITCH LOGFILE;
SQL>ALTER SYSTEM SWITCH LOGFILE;
SQL>shutdown immediate;
删掉test目录下的tt.dbf文件.
SQL>STARTUP
报错,说tt.dbf有问题
SQL>SELECT * FROM v$recover_file;
恢复:
SQL>ALTER DATABASE DATAFILE 6 OFFLINE DROP;
SQL>ALTER DATABASE OPEN;
复制刚才备份的tt.dbf文件到test目录下.
SQL>SELECT * FROM tt.deptment;
找不到内容
SQL>RECOVER DATAFILE 6
使用AUTO
SQL>ALTER DATABASE DATAFILE 6 ONLINE;
SQL>SELECT * FROM tt.deptment;

联机情况下备份控制文件:
SQL>ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
备份的目录在10.1.0\admin\test\udump下面.
打开最近生成的文件,里面有生成控制文件的脚本.
从STARTUP NOMOUNT(约在第70行位置),到CHARACTER SET ZHS16GBK(约在91行位置)选中,再到ALTER DATABASE OPEN;(大约在第103行),复制,放到一个单独的文件中.
把TEST目录下的三个控制文件先复制到其他地方,再把它们删掉.
SQL>shutdown immediate
SQL>@C:\create_ctl.txt
会在test目录下重新出现三个控制文件.
SQL>SELECT user FROM dual;
SQL>ho cls

如果数据文件丢失了一个或多个的处理:
SQL>recover database until cancel 基于取消的恢复
SQL>alter database open resetlogs 重新生成日志文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ORACLE