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执行强行断开连接并直接关闭数据库。

前三种方式不回丢失用户数据。第四种在不的已的情况下,不建议采用!