Oracle系列<一>
一.Oracle恢复被删除的数据
A.数据用Delete误删除掉后,而且提交了。需要两步进行恢复:
1.打开Flash存储的权限
ALTERTABLEtablenameENABLErowmovement;
2.把表还原到指定时间点
flashbacktabletablenametotimestampto_timestamp(''2008-02-2810:40:00'',''yyyy-mm-ddhh24:mi:ss'');
后面的参数为要还原的时间点
B.Oracle10g开始,当我执行DropTable时,Oracle也会把被删除的表放到数据库回收站(DatabaseRecyclebin)里。这样我们就可以用flashbacktable命令恢复被删除的表,语法:
Flashbacktable表名tobeforedrop;
开始恢复,执行以下命令:
flashbacktabletablenameTOTIMESTAMPto_timestamp('2007-05-22
12:00:00','yyyy-mm-ddhh24:mi:ss')
弹出ORA-08189错误,需要执行以下命令先:
altertabletablenameenablerowmovement
这个命令的作用是,允许oracle修改分配给行的rowid。
二.快速删除ORACLE重复记录(两种实现方式)
1.通过创建临时表来实现
Sql代码
createtabletemp_empas(selectdistinct*fromemployee)
truncatetableemployee;(清空employee表的数据)
insertintoemployeeselect*fromtemp_emp;
createtabletemp_empas(selectdistinct*fromemployee)
truncatetableemployee;(清空employee表的数据)
insertintoemployeeselect*fromtemp_emp;
2.通过rowid来实现
Sql代码
deletefromemployeewhererowidnotin(
selectmax(t1.rowid)fromemployeet1groupbyt1.emp_id,t1.emp_name,t1.salary);
deletefromemployeewhererowidnotin(
selectmax(t1.rowid)fromemployeet1groupbyt1.emp_id,t1.emp_name,t1.salary);
三.Oracle中锁定用户以及解锁
操作用户必须有DBA权限
加锁代码
alterusertestaccountlock;
解锁代码
alterusertestaccountunlock;
四.Oracle游标
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
Oracle中的游标有两种:显式游标、隐式游标。
显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。
五.char和varchar2的区别
区别:
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的,比如,存储字符串“abc",对于CHAR(20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2(20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
何时该用CHAR,何时该用varchar2?
CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.
VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(RowMigration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。
六.Oracle中时间的函数
一、常用日期数据格式
1.Y或YY或YYY年的最后一位,两位或三位
SQL>Selectto_char(sysdate,'Y')fromdual;
TO_CHAR(SYSDATE,'Y')
--------------------
7
SQL>Selectto_char(sysdate,'YY')fromdual;
TO_CHAR(SYSDATE,'YY')
---------------------
07
SQL>Selectto_char(sysdate,'YYY')fromdual;
TO_CHAR(SYSDATE,'YYY')
----------------------
007
2.Q季度1~3月为第一季度,2表示第二季度。
SQL>Selectto_char(sysdate,'Q')fromdual;
TO_CHAR(SYSDATE,'Q')
--------------------
2
3.MM月份数
SQL>Selectto_char(sysdate,'MM')fromdual;
TO_CHAR(SYSDATE,'MM')
---------------------
05
4.RM月份的罗马表示(V在罗马数字中表示5)
SQL>Selectto_char(sysdate,'RM')fromdual;
TO_CHAR(SYSDATE,'RM')
---------------------
V
5.Month用9个字符长度表示的月份名
SQL>Selectto_char(sysdate,'Month')fromdual;
TO_CHAR(SYSDATE,'MONTH')
------------------------
5月
6.WW当年第几周(2007年5月29日为2007年第22周)
SQL>Selectto_char(sysdate,'WW')fromdual;
TO_CHAR(SYSDATE,'WW')
---------------------
22
7.W本月第几周(2007年5月29日为5月第5周)
SQL>Selectto_char(sysdate,'W')fromdual;
TO_CHAR(SYSDATE,'W')
--------------------
5
8.DDD当年第几天(2007年5月29日为2007年第149天)
SQL>Selectto_char(sysdate,'DDD')fromdual;
TO_CHAR(SYSDATE,'DDD')
----------------------
149
9.DD当月第几天
SQL>Selectto_char(sysdate,'DD')fromdual;
TO_CHAR(SYSDATE,'DD')
---------------------
29
10.D周内第几天
SQL>Selectto_char(sysdate,'D')fromdual;
TO_CHAR(SYSDATE,'D')
--------------------
3
11.DY中文的星期几((2007年5月29日为星期二))
SQL>Selectto_char(sysdate,'DY')fromdual;
TO_CHAR(SYSDATE,'DY')
---------------------
星期二
12.HH或HH1212进制小时数(16:09分为用12小时制计时为4点)
SQL>Selectto_char(sysdate,'HH')fromdual;
TO_CHAR(SYSDATE,'HH')
---------------------
04
13.HH2424小时制
SQL>Selectto_char(sysdate,'HH24')fromdual;
TO_CHAR(SYSDATE,'HH24')
-----------------------
16
二、常用时间函数
1.trunc(sysdate,'Q')本季度第一天
SQL>selecttrunc(sysdate,'Q')fromdual;
TRUNC(SYSDATE,'Q')
------------------
2007-4-1
2.trunc(sysdate,'D')本周的第一天(周日)
SQL>selecttrunc(sysdate,'D')fromdual;
TRUNC(SYSDATE,'D')
------------------
2007-5-27
3.last_day(sysdate)本月最后一天
SQL>selectlast_day(sysdate)fromdual;
LAST_DAY(SYSDATE)
-----------------
2007-5-3115:20:3
4.add_months(sysdate,2)日期sysdate后推2个月
SQL>selectadd_months(sysdate,2)fromdual;
ADD_MONTHS(SYSDATE,2)
---------------------
2007-7-2915:21:14
5.next_day(sysdate,2)日期sysdate之后的第一周中,第2(指定星期的第几天)是什么日期
SQL>selectnext_day(sysdate,2)fromdual;
NEXT_DAY(SYSDATE,2)
-------------------
2007-6-415:22:10
6.Months_between(f,s)日期f和s间相差月数
SQL>selectmonths_between(sysdate,to_date('2007-04-12','yyyy-mm-dd'))fromdual;
MONTHS_BETWEEN(SYSDATE,TO_DATE
------------------------------
1.56909908900836
7.得到SYSDATE+5所在的月份
SQL>SELECTto_char(SYSDATE+5,'mon','nls_date_language=american')FROMdual;
TO_CHAR(SYSDATE+5,'MON','NLS_D
------------------------------
jun
8.current_date()返回当前会话时区中的当前日期。
9.selectdbtimezonefromdual;
10.extract()找出日期或间隔值的字段值
SQL>selectextract(monthfromsysdate)"ThisMonth"fromdual;
ThisMonth
----------
5
SQL>selectextract(yearfromsysdate)"Thisyear"fromdual;
Thisyear
----------
2007
SQL>selectextract(monthfromadd_months(sysdate,2))"Month"fromdual;
Month
----------
7
==================================================================
三、一些实践后的用法:
1.上月末天:
selectto_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd')LastDayfromdual;
2.上月今天
SQL>selectto_char(add_months(sysdate,-1),'yyyy-MM-dd')PreTodayfromdual;
3.上月首天
SQL>selectto_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd')firstDayfromdual;
4.要找到某月中所有周五的具体日期
SELECTto_char(b.a,'YY-MM-DD')
FROM(SELECTtrunc(SYSDATE,'mm')+ROWNUM-1a
FROMdba_objectswhererownum<32)b
WHEREto_char(b.a,'day')='星期五';
如果把whereto_char(t.d,'MM')=to_char(sysdate,'MM')改成sysdate-90,即为查找当前月份的前三个月中
的每周五的日期。
5.得到系统当前月及以后的日期
selecttrunc(sysdate,'MM')+ROWNUM-1FROMdba_objects;
-----------------------------------
to_date字符串类型转为换日期类型
字符串中的相应位置上的字符,必须符合时间范围的限制
14.MI分钟数(0~59)
提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。
15.SS秒数(0~59)
七.Linux下启动与关闭Oralce10G
启动
命令代码
1.切换到oracle用户:
su-oracle
2.启动监听:
lsnrctlstart
3.进入sqlplus:
sqlplus/assysdba
4.启动数据库:
startup
1.切换到oracle用户:
su-oracle
2.启动监听:
lsnrctlstart
3.进入sqlplus:
sqlplus/assysdba
4.启动数据库:
startup
关闭
命令代码
shutdown
shutdown的参数
Normal需要等待所有的用户断开连接
Immediate等待用户完成当前的语句
Transactional等待用户完成当前的事务
Abort不做任何等待,直接关闭数据库
normal需要在所有连接用户断开后才执行关闭数据库任务,所以有的时候看起来好象命令没有运行一样!在执行这个命令后不允许新的连接
immediate在用户执行完正在执行的语句后就断开用户连接,并不允许新用户连接。
transactional在拥护执行完当前事物后断开连接,并不允许新的用户连接数据库。
abort执行强行断开连接并直接关闭数据库。
前三种方式不回丢失用户数据。第四种在不的已的情况下,不建议采用!