Oracle系列<一>

一. Oracle恢复被删除的数据

A. 数据用Delete误删除掉后,而且提交了。需要两步进行恢复:

1.打开Flash存储的权限

  ALTER TABLE tablename ENABLE row movement ;


2.把表还原到指定时间点

flashback table tablename to timestamp to_timestamp(''2008-02-28 10:40:00'',''yyyy-mm-dd hh24:mi:ss'');

后面的参数为要还原的时间点


B. Oracle 10g开始,当我执行Drop Table时,Oracle也会把被删除的表放到数据库回收站(Database Recyclebin)里。这样我们就可以用flashback table命令恢复被删除的表,语法:
   Flashback table 表名 to before drop;

开始恢复,执行以下命令:

flashback table tablename TO TIMESTAMP to_timestamp('2007-05-22
12:00:00','yyyy-mm-dd hh24:mi:ss')

弹出ORA-08189错误,需要执行以下命令先:
alter table tablename enable row movement
这个命令的作用是,允许oracle修改分配给行的rowid。


二. 快速删除ORACLE重复记录(两种实现方式)

1.通过创建临时表来实现
Sql代码
create table temp_emp as (select distinct * from employee)  
    
truncate table employee; (清空employee表的数据)  
 
insert into employee select * from temp_emp; 

create table temp_emp as (select distinct * from employee)
 
truncate table employee; (清空employee表的数据)

insert into employee select * from temp_emp;



2.通过rowid来实现
Sql代码
delete from employee where rowid not in (   
select max(t1.rowid) from employee t1 group by t1.emp_id,t1.emp_name,t1.salary); 

delete from employee where rowid not in (
select max(t1.rowid) from employee t1 group by t1.emp_id,t1.emp_name,t1.salary);



三.Oracle中锁定用户以及解锁

操作用户必须有DBA权限

加锁代码
alter user test account lock; 

解锁代码
alter user test account unlock; 


四.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列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。  


六.Oracle中时间的函数

一、 常用日期数据格式
1.Y或YY或YYY 年的最后一位,两位或三位

SQL> Select to_char(sysdate,'Y') from dual;

TO_CHAR(SYSDATE,'Y')
--------------------
7

SQL> Select to_char(sysdate,'YY') from dual;

TO_CHAR(SYSDATE,'YY')
---------------------
07

SQL> Select to_char(sysdate,'YYY') from dual;

TO_CHAR(SYSDATE,'YYY')
----------------------
007

2.Q 季度 1~3月为第一季度,2表示第二季度。

SQL> Select to_char(sysdate,'Q') from dual;

TO_CHAR(SYSDATE,'Q')
--------------------
2

3.MM 月份数

SQL> Select to_char(sysdate,'MM') from dual;

TO_CHAR(SYSDATE,'MM')
---------------------
05

4.RM 月份的罗马表示 (V在罗马数字中表示 5)

SQL> Select to_char(sysdate,'RM') from dual;

TO_CHAR(SYSDATE,'RM')
---------------------
V

5.Month 用9个字符长度表示的月份名

SQL> Select to_char(sysdate,'Month') from dual;

TO_CHAR(SYSDATE,'MONTH')
------------------------
5月

6.WW 当年第几周 (2007年5月29日为2007年第22周)

SQL> Select to_char(sysdate,'WW') from dual;

TO_CHAR(SYSDATE,'WW')
---------------------
22

7.W 本月第几周 (2007年5月29日为5月第5周)

SQL> Select to_char(sysdate,'W') from dual;

TO_CHAR(SYSDATE,'W')
--------------------
5

8.DDD 当年第几天 (2007年5月29日为2007年第149天)

SQL> Select to_char(sysdate,'DDD') from dual;

TO_CHAR(SYSDATE,'DDD')
----------------------
149

9. DD 当月第几天

SQL> Select to_char(sysdate,'DD') from dual;

TO_CHAR(SYSDATE,'DD')
---------------------
29

10.D 周内第几天

SQL> Select to_char(sysdate,'D') from dual;

TO_CHAR(SYSDATE,'D')
--------------------
3

11.DY 中文的星期几 ( (2007年5月29日为星期二))

SQL> Select to_char(sysdate,'DY') from dual;

TO_CHAR(SYSDATE,'DY')
---------------------
星期二

12.HH或HH12 12进制小时数 (16:09分为用12小时制计时为4点)

SQL> Select to_char(sysdate,'HH') from dual;

TO_CHAR(SYSDATE,'HH')
---------------------
04

13.HH24 24小时制

SQL> Select to_char(sysdate,'HH24') from dual;

TO_CHAR(SYSDATE,'HH24')
-----------------------
16

二、常用时间函数

1.trunc(sysdate,'Q') 本季度第一天

SQL> select trunc(sysdate,'Q') from dual;

TRUNC(SYSDATE,'Q')
------------------
2007-4-1

2.trunc(sysdate,'D') 本周的第一天(周日)

SQL> select trunc(sysdate,'D')from dual;

TRUNC(SYSDATE,'D')
------------------
2007-5-27

3.last_day(sysdate) 本月最后一天

SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDATE)
-----------------
2007-5-31 15:20:3

4.add_months(sysdate,2) 日期sysdate后推2个月


SQL> select add_months(sysdate,2) from dual;

ADD_MONTHS(SYSDATE,2)
---------------------
2007-7-29 15:21:14

5.next_day(sysdate,2) 日期sysdate之后的第一周中,第2(指定星期的第几天)是什么日期

SQL> select next_day(sysdate,2) from dual;

NEXT_DAY(SYSDATE,2)
-------------------
2007-6-4 15:22:10

6.Months_between(f,s) 日期f和s间相差月数

SQL> select months_between(sysdate,to_date('2007-04-12','yyyy-mm-dd'))from dual;

MONTHS_BETWEEN(SYSDATE,TO_DATE
------------------------------
1.56909908900836


7.得到SYSDATE+5所在的月份

SQL> SELECT to_char(SYSDATE+5,'mon','nls_date_language=american') FROM dual;

TO_CHAR(SYSDATE+5,'MON','NLS_D
------------------------------
jun

8.current_date()返回当前会话时区中的当前日期 。

9.select dbtimezone from dual;

10.extract()找出日期或间隔值的字段值

SQL> select extract(month from sysdate) "This Month" from dual;

This Month
----------
5
SQL> select extract(year from sysdate) "This year" from dual;

This year
----------
2007
SQL> select extract(month from add_months(sysdate,2)) " Month" from dual;

Month
----------
7


==================================================================

三、一些实践后的用法:

1.上月末天:
select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual;

2.上月今天
SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;

3.上月首天
SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

4.要找到某月中所有周五的具体日期

SELECT to_char(b.a,'YY-MM-DD')
FROM ( SELECT trunc(SYSDATE,'mm')+ROWNUM-1 a
FROM dba_objects where rownum < 32 ) b
WHERE to_char(b.a,'day')='星期五';


如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90,即为查找当前月份的前三个月中

的每周五的日期。


5.得到系统当前月及以后的日期

select trunc(sysdate, 'MM')+ROWNUM-1 FROM dba_objects ;



-----------------------------------

to_date 字符串类型转为换日期类型
字符串中的相应位置上的字符,必须符合时间范围的限制 

14.MI 分钟数(0~59)
提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。

15.SS 秒数(0~59)



七.Linux下启动与关闭Oralce 10G

启动
命令代码
1.切换到oracle用户:  
 
su - oracle   
 
2.启动监听:  
 
lsnrctl start   
 
3.进入sqlplus:  
 
sqlplus / as sysdba   
 
4.启动数据库:  
 
startup  

1.切换到oracle用户:

su - oracle

2.启动监听:

lsnrctl start

3.进入sqlplus:

sqlplus / as sysdba

4.启动数据库:

startup


关闭
命令代码
shutdown  
 
shutdown的参数   
 
Normal 需要等待所有的用户断开连接  
Immediate 等待用户完成当前的语句  
Transactional 等待用户完成当前的事务  
Abort 不做任何等待,直接关闭数据库  
normal需要在所有连接用户断开后才执行关闭数据库任务,所以有的时候看起来好象命令没有运行一样!在执行这个命令后不允许新的连接  
immediate在用户执行完正在执行的语句后就断开用户连接,并不允许新用户连接。  
transactional 在拥护执行完当前事物后断开连接,并不允许新的用户连接数据库。  
abort 执行强行断开连接并直接关闭数据库。  
前三种方式不回丢失用户数据。第四种在不的已的情况下,不建议采用! 













你可能感兴趣的:(oracle,sql,linux,F#,Flash)