数据库有多重要不需我多说
本人项目做的挺多, 不过数据库方面的项目不多.
由于金融危机, 目前没项目, 想给自己充电, 学习下oracle, 却苦于没有好的oracle的资料,
希望各位能发给我一份比较不错的oracle资料, 最好从基础开始, 然后逐渐深入的那种 呵呵
我的邮件: [email protected]先谢了
本人项目做的挺多, 不过数据库方面的项目不多.
由于金融危机, 目前没项目, 想给自己充电, 学习下oracle, 却苦于没有好的oracle的资料,
希望各位能发给我一份比较不错的oracle资料, 最好从基础开始, 然后逐渐深入的那种 呵呵
我的邮件: [email protected]先谢了
解决方案 »
- 这样的能不能通过一条语句完成
- 连接无法用于此操作。在此上下文中它可能已被关闭或无效。
- 求SQL查询某两个或多个表中是否包含有同名的字段
- 菜鸟请教一个触发器的问题---在线等
- 几个问题,怎么运行存储过程?
- 创建自动增长ID无效 帮忙看一下
- 谁能提供一些ORACLE中交叉报表的示例!!
- 我用PowerDesigner10和ER/Studio6.5的反向工程都不能得到视图的Trigger,为什么?
- 请问那有关于oracle9i的电子般的中文图书可下载
- 为什么我的plsql developer连接远程数据库之后,无法连接本地oracle
- Oracle中给如何用户分配表权限
- 菜鸟问题:导出与还原的用户身份
数据库编程
sql编程
sql语句及优化
数据库管理
自带函数等
-- 表
create table test (names varchar2(12),
dates date,
num int,
dou double);
-- 视图
create or replace view vi_test as
select * from test; -- 同义词
create or replace synonym aa
for dbusrcard001.aa; -- 存储过程
create or replace produce dd(v_id in employee.empoy_id%type)
as
begin
end
dd; -- 函数
create or replace function ee(v_id in employee%rowtype) return varchar(15)
is
var_test varchar2(15);
begin
return var_test;
exception when others then
end -- 三种触发器的定义
create or replace trigger ff
after delete
on test
for each row
declare
begin
delete from test;
if sql%rowcount < 0 or sql%rowcount is null then
rais_replaction_err(-20004,"错误")
end if
end
create or replace trigger gg
after insert
on test
for each row
declare
begin
if :old.names = :new.names then
raise_replaction_err(-2003,"编码重复");
end if
end
create or replace trigger hh
after update
on test
for each row
declare
begin
if updating then
if :old.names <> :new.names then
reaise_replaction_err(-2002,"关键字不能修改")
end if
end if
end
--同时三种触发器
create or replace trigger tr
before update or delete or insert
on t
for each row
begin
if inserting then
insert into tt values(:new.id,:new.name,:new.age,to_char(sysdate,'yyyy'),'insert',user);
elsif updating then
insert into tt values(:new.id,:new.name,:new.age,to_char(sysdate,'yyyy'),'update',user);
elsif deleting then
insert into tt values(:new.id,:new.name,:new.age,to_char(sysdate,'yyyy'),'delete',user);
end if;
end;--触发器例子
CREATE OR REPLACE TRIGGER temp_aiur
AFTER INSERT OR UPDATE ON TEMP
FOR EACH ROW
BEGIN
CASE
WHEN inserting THEN
dbms_output.put_line
('executing temp_aiur - insert');
WHEN updating THEN
dbms_output.put_line
('executing temp_aiur - update');
END CASE;
END;
-- 定义游标
declare
cursor aa is
select names,num from test;
begin
for bb in aa
loop
if bb.names = "ORACLE" then
end if
end loop;
end --另外一个游标的例子
DELCARE
CURSOR C_EMP IS SELECT empno,ename,salary
FROM emp
WHERE salary>2000
ORDER BY ename;
........
BEGIN 打开游标
使用游标中的值之前应该首先打开游标,打开游标初始化查询处理。打开游标的语法是:
OPEN cursor_name
cursor_name是在声明部分定义的游标名。
例:
OPEN C_EMP;
关闭游标
语法:
CLOSE cursor_name
例:
CLOSE C_EMP;
-- 速度优化,前一语句不后一语句的速度快几十倍
select names,dates
from test,b
where test.names = b.names(+) and
b.names is null and
b.dates > date('2003-01-01','yyyy-mm-dd')
select names,dates
from test
where names not in ( select names
from b
where dates > to_date('2003-01-01','yyyy-mm-dd'))
-- 查找重复记录
select names,num
from test
where rowid != (select max(rowid)
from test b
where b.names = test.names and
b.num = test.num)
-- 查找表TEST中时间最新的前10条记录
select * from (select * from test order by dates desc) where rownum < 11 -- 序列号的产生
create sequence row_id
minvalue 1
maxvalue 9999999999999999999999
start with 1
increment by 1 insert into test values(row_id.nextval,....)
当前序列号row_id.currentval
下一个序列号row_id.nextval二:存储过程与函数的区别
1、函数的作用在于计算,存储过程的作用在于操作。
2、函数必须有返回值,存储过程不必。
3、存储过程是命令可以直接执行, 而函数是表达式的一部分必须是被调用,
比如
select max(NAME) FROM T
但是不能 exec max(NAME),因为max是函数。 三:unix的基本命令(与数据库有关)。
cd, ls,mkdir,
compress //压缩
uncompress //解压缩
bdf //查看数据文件
crontab -l //查看定时job
ps -ef | grep 关键词 //查看特定进程,关键词一般为终端名或进程名
Kill 进程号 -9 //
tar -cvfp 打包的文件名 要打包的目录
另外还有grep/top/echo/date等,其他的命令和具体的参数,你可以再查一查。四:oracle的临时表
ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法 临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。 两种临时表的语法: create global temporary table 临时表名 on commit preserve|delete rows
用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表 例:1、SESSION级临时表 --建立临时表 create global temporary table temp_tbl(col_a varchar2(30))
on commit preserve rows --插入数据 insert into temp_tbl values('test session table') --提交 commit --查询数据 select *from temp_tbl 可以看到数据'test session table'记录还在 --结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录 2、TRANSACTION级临时表 --建立临时表 create global temporary table temp_tbl(col_a varchar2(30))
on commit delete rows --插入数据 insert into temp_tbl values('test transaction table') --提交
commit
--查询数据 select *from temp_tbl 这时候可以看到刚才插入的记录'test transaction table'已不存在了;同样,如果不提交而直接结束SESSION,重新登录记录也不存在。
1、EXP:
有三种主要的方式(完全、用户、表)
1、完全:
EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
如果要执行完全导出,必须具有特殊的权限
2、用户模式:
EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC
这样用户SONIC的所有对象被输出到文件中。
3、表模式:
EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
这样用户SONIC的表SONIC就被导出
2、IMP:
具有三种模式(完全、用户、表)
1、完全:
IMP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
2、用户模式:
IMP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP FROMUSER=SONIC TOUSER=SONIC
这样用户SONIC的所有对象被导入到文件中。必须指定FROMUSER、TOUSER参数,这样才能导入数据。
3、表模式:
EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
这样用户SONIC的表SONIC就被导入。 查询索引键:
select index_name,tablespace_name,initial_extent,next_extent,owner,table_name
from all_indexes where index_name IN ('TEST_PARTITION_I' ,'TEST_PARTITION_I1');修改用户密码
connect / as sysdba;
用户解锁
ALTER USER 用户 ACCOUNT UNLOCK;
alter user 用户名 identified by '123456'; 授权:
grant select on user1.table1, update on user1.table1 to user2;
grant select on user1.table2, update on user1.table2 to user2;查询新建用户
select username
from dba_users
where username not in
('TEXT', 'RMAN_USER', 'TEST', 'SCOTT', 'TSMSYS', 'MDDATA', 'DIP',
'DBSNMP', 'SYSMAN', 'MDSYS', 'ORDSYS', 'EXFSYS', 'DMSYS', 'WMSYS',
'CTXSYS', 'ANONYMOUS', 'XDB', 'ORDPLUGINS', 'SI_INFORMTN_SCHEMA',
'OLAPSYS', 'MGMT_VIEW', 'SYS', 'SYSTEM', 'OUTLN');
查询那些用户,操纵了那些表造成了锁机
SELECT s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,all_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null 其中 TM 为表锁定 TX 为行锁定 然后执行 alter system kill session '19,1' 其中 19为s.sid,1为s.serial# 清除 数据库的锁看锁阻塞的方法是
SELECT (select username FROM v$session WHERE sid=a.sid) blocker,
a.sid,
'is blocking',
(select username FROM v$session WHERE sid=b.sid) blockee,
b.sid
FROM v$lock a, v$lock b
WHERE a.block = 1
AND b.request > 0
AND a.id1 = b.id1
AND a.id2 = b.id2