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

数据库复习及Oracle学习

2007-08-08 14:55 393 查看
一.基础知识
为显示方便,可以直接在字段后加上标签(别名)
sum(decode())用来统计
order by desc/asc 排序
distinct,不显示重复的。

分组:
group by 字段 ,与select前边的字段匹配。
聚集函数(max,min,sum,avg)不能出现在where中,这时用having

模糊查询
like a%,以a开头的。

表的连接
from * join * on
内连接
左,右外连接(非完全匹配)(+)

无关子查询 IN NOT IN
相关子查询
子查询中不能用*

EXISTS ,可以用*

表合并
UNION,只是显示合并

INTERSECT返回两个表中都出现的行

插入多条记录:INSERT INTO * SELECT结果集
INSERT INTO VALUES,只能插入一条记录
根据已有的表来创建表。
CREATE TABLE ttt AS (SELECT * FROM *)

二.PL/SQL
补充:前后台参数传递。PL/SQL:

DECLARE
...
BEGIN
....
EXCEPTION
...
END

输出:DBMS_OUTPUT.PUT_LINE('');
|| 连接字符,与其他语言的 + 类似,不需要转换类型

SET SERVEROUTPUT ON SIZE 10000设置缓冲区大小用于输出到屏幕
--行注释
/**/块注释

IF分支
IF...THEN
...
ELSIF...THEN
...
ELSE
...
END IF

CASE分支
WHEN ..THEN..
WHEN ..THEN..
ELSE
ENDCASE

LOOP循环
LOOP
...
END LOOP

WIHLE循环
WHILE expression LOOP
...
END LOOP

FOR循环

GOTO循环

记录:
TYPE * IS RECORD,定义记录,(表的一行)
DELCARE
TYPE myrecord IS RECORD(
id varchar2(10),
name varchar2(10)),
real_record myrecord;

与表字段的类型,结构相同
DECLARE
myrec 表A%ROWTYPE 如果只有其中一个字段相同,跟上面的一样,改一处,id A.eid%TYPE
BEGIN
SELECT * INTO myrec FROM A WHERE...

游标
游标CURSOR:一种PL/SQL控制结构,可以对SQL语句的处理进行显示控制,便于对表的行数据逐条进行处理。

游标的属性:%FOUND,%ISOPEN,%NOTFOUND,%ROWCOUNT

显式
DELCARE
CURSOR mycur IS
SELECT * FROM books;
myrecord books%ROWTYPE;
BEGIN
OPEN mycur;
FETCH mycur INTO myrecord;
WHILE mycur%FOUND LOOP
DBMS_OUT.PUT_LINE(myrecord.books_id);
FETCH mycur INTO myrecord;
END LOOP
CLOSE mycur;
END;
/
游标参数1
DELCARE
CURSOR mycur_para(id varchar2) IS
SELECT books_name FROM books WHERE books_id=id;
t_name books.books_name%TYPE;
BEGIN
OPEN mycur_para('001');
LOOP
FETCH mycur_para INTO t_name;
EXIT WHEN mycur_para%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(t_name);
END LOOP
CLOSE mycur_para;
END;
/
游标参数2
DELCARE
CURSOR mycur_para(id varchar2) IS
SELECT books_name FROM books WHERE books_id=id;
BEGIN
DBMS_OUTPUT.PUT_LINE('****结果集是:****');
FOR cur IN mycur_para('001') LOOP ——for循环不需要打开关闭
DBMS_OUTPUT.PUT_LINE(cur.books_name);
END LOOP;
END;
/
游标 ISOPEN
DECLARE
t_name books.books_name%TYPE;
CURSOR mycur(id varchar2) IS
SELECT books_name FROM books WHERE books_id=id;
BEGIN
IF mycur%ISOPEN THE
DBMS_OUTPUT.PUT_LINE('游标已经被打开');
ELSE
OPEN mycur('003')
END IF
FETCH mycur INTO t_name;
CLOSE mycur;
DBMS_OUTPUT.PUT_LINE(t_name);
END;
/

利用游标修改数据 必须在SELECT语句后加上 FOR UPDATE
UPDATE deptment SET name=name||'_fujia' WHERE CURRENT OF mycur

隐式:没有声明,打开,关闭
BEGIN
FOR mycur IN (SECLECT name FROM *) LOOP
打印输出
END LOOP;
END;

三.存储过程
定义:

将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

那么存储过程与一般的SQL语句有什么区别呢?

存储过程的优点:

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3.存储过程可以重复使用,可减少数据库开发人员的工作量

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权

存储过程的种类:

1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,

如 sp_help就是取得指定对象的相关信息

2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能

exec master..xp_cmdshell 'ping 10.8.16.1'

3.用户自定义的存储过程,这是我们所指的存储过程

常用格式

Create procedure procedue_name

[@parameter data_type][output]

[with]{recompile|encryption}

as

sql_statement

解释:

output:表示此参数是可传回的

with {recompile|encryption}

recompile:表示每次执行此存储过程时都重新编译一次

encryption:所创建的存储过程的内容会被加密

存储过程的3种传回值:
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中
CREATE OR REPLACE PROCEDURE myproc(id IN varchar2(10))
IS
name varchar2(10);
BEGIN

四.视图、同义词、序列
视图(安全,方便,一致性,虚表):实际上是一条查询语句,是数据的显现方式
CREATE OR REPLACE VIEW myview
AS
SELECT * FROM books;

通过视图更新两个基表,不可行。(触发器)
带group by,sum avg等聚合函数,或者distinct,视图不可更新。
WITH READ ONLY

同义词:缩写代码。可以方便地操纵不同用户模式下的对象
CREATE SYNONYM dept FOR scott.dept;
当前用户的专有的私有的。
DROP SYNONYM dept
删除
CREATE PUBLIC SYNONYM dept FOR scott.dept;
创建公共的。

序列:??
CREATE SEQUENCE myseq
START WITH 1
INCREMENT BY 1
ORDER
NOCYCLE;

五.触发器、表空间、索引
触发器:自动执行,不接受参数。
事务:用于确保数据完整性和并发处理的能力,将一条、一组SQL语句当作一个逻辑上的单元,用于保证这些语句都成功/失败
事务的特性:
A(Atomicity):原子性,不可分割
C(Consistency):一致性,操作前后一致。
I(Isolation):隔离性,与并发性紧密结合,不会自己提交(如果没提交,在当前用户下好像更新,其实没有更新,必须提交),COMMIT;ROLLBACK;设置用户FOR UPDATE,别的用户只能等,不能操作,只有等那个用户提交后才能操作。(类似“锁”)
D(Duralibility):永久性,COMMIT和ROLLBACK,不能一起操作

行级触发器:实现多表的完整性,实现原子性
CREATE OR REPLACE TRIGGER del_deptid
AFTER DELETE ON deptment
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE id=:old.id;
END del_deptid;
/
在触发器中不允许的操作: IF:old.books_id='0001' THEN RAISE_APPLICATION_ERROR(-20000,'不允许删除')

语句级触发器:不涉及数据完整性
CREATE OR REPLACE TRIGGER dml_aa
AFTER INSERT OR DELETE OR UPDATE ON mytable
BEGIN
IF INSERTING THEN
INSERT INTO mytable VALUES('''');
ELSIF DELETING THEN
...
ELSE
...
END IF;
END;

替换触发器(此触发器只能建立在视图上,可用于视图多表更新)

表空间
创建表空间
CREATE TABLESPACE tabs
DATAFILE '实例的路径/tabs.dbf' SIZE 10M

授权
GRANT UNLIMITED TABLESPACE

索引:提高速度
位图索引(bitmap INDEX),(数据多,比如性别,只有很少的几种)

SQL*Loader
事先有数据文件和控制文件
控制文件可能是这样的形式:
load data
infile 'c:/loader.txt'
append
into table 表名(
m1 position(1:3) char, --长度知道,并相同时,否则可以用 terminated by "," --以逗号分割
m2 position(5:8) char
)

》sqlldr control 控制文件路径 data 数据文件路径

OEM:企业管理工具,在浏览器中

六.数据库的备份和恢复

逻辑备份
exp test/test123@test
后缀名.dmp
逻辑恢复
imp test/test123

冷(脱机)、热(联机)物理备份
冷:shutdown immediate之后,把相关内容拷走。

热:
日志归档方式
查看 archive log list;
alter system set log_archive start=true scope=spfile;

shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

例子:
alter tablespace 表 begin backup;
把东西拷走
alter tablespace 表 end backup;
alter system archive log current;
alter system switch logfile;
shutdown immediate;

重新打开后查看错误
select * from v$recover_file;
alter database datafile ? offline drop;
alter database open;

最后 recover datafile ?;

alter database datafile ? online;
恢复完毕

备份控制文件
alter database backup controlfile to trace; --在admin下的实例下的udump下

日志文件丢失
重新生产日志文件
alter database open resetlogs;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: