注意:数据库版本是10g,不过大部分9i的也适用,闪回9i就没有.
?
1.曾经不小心把开发库的数据库表全部删除,当时吓的要死。结果找到下面的语句恢复到了1个小时之前的数据!很简单。
注意使用管理员登录系统:
select * from 表名 as of timestamp sysdate-1/12?? //查询两个小时前的某表数据!既然两小时以前的数据都得到了,继续怎么做,知道了吧。。
?
如果drop了表,怎么办??见下面:
drop table 表名;
数据库误删除表之后恢复:(?绝对ok,我就做过这样的事情,汗?)不过要记得删除了哪些表名。?
flashback table 表名 to before drop;
?
2.查询得到当前数据库中锁,以及解锁:
查锁
SELECT /*+ rule */ 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,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL;
解锁
alter system kill session 'sid,serial';?
如果解不了。直接倒os下kill进程kill -9 spid
?
?ORA-28000:账户被锁定
因为密码输入错误多次用户自动被锁定.
解决办法:alter user user_name account unlock;
?
3.关于查询数据库用户,权限的相关语句:
- 1.查看所有用户:??
- select?*?from?dba_user;??
- select?*?from?all_users;??
- select?*?from?user_users;??
- ??
- ??
- 2.查看用户系统权限:??
- select?*?from?dba_sys_privs;??
- select?*?from?all_sys_privs;??
- select?*?from?user_sys_privs;??
- ??
- ??
- 3.查看用户对象权限:??
- select?*?from?dba_tab_privs;??
- select?*?from?all_tab_privs;??
- select?*?from?user_tab_privs;??
- ??
- ??
- 4.查看所有角色:??
- select?*?from?dba_roles;??
- ??
- ??
- 5.查看用户所拥有的角色:??
- select?*?from?dba_role_privs;??
- select?*?from?user_role_privs;??
?
4.几个经常用到的oracle视图:注意表名使用大写....................
- 1.?查询oracle中所有用户信息??
- ???????select??*?from?dba_user;??
- ???2.?只查询用户和密码??
- ???????select?username,password?from?dba_users;??
- ???3.?查询当前用户信息??
- ???????select?*?from?dba_ustats;??
- ???4.?查询用户可以访问的视图文本??
- ???????select?*?from?dba_varrays;??
- ???5.?查询数据库中所有视图的文本??
- ???????select?*?from?dba_views;??
- 6.查询全部索引???
- select?*?from?user_indexes;??
- 查询全部表格??
- ??????select?*?from?user_tables;??
- ?????????查询全部约束??
- ??????select?*?from?user_constraints;??
- ??????????查询全部对象??
- ??????select?*?from?user_objects;??
?
5.查看当前数据库中正在执行的语句,然后可以继续做很多很多事情,例如查询执行计划等等
- (1).查看相关进程在数据库中的会话?????
- ??Select???a.sid,a.serial#,a.program,???a.status???,?????
- ??substr(a.machine,1,20),???a.terminal,b.spid?????
- ??from???v$session???a,???v$process???b?????
- ??where???a.paddr=b.addr?????
- ??and???b.spid???=???&spid;?????
- ??????
- ??(2).查看数据库中被锁住的对象和相关会话?????
- ??select???a.sid,a.serial#,a.username,a.program,?????
- ??c.owner,???c.object_name???????
- ??from???v$session???a,???v$locked_object???b,???all_objects???c?????
- ??where???a.sid=b.session_id???and?????
- ??c.object_id???=???b.object_id;?????
- ??????
- ??(3).查看相关会话正在执行的SQL?????
- ??select???sql_text???from???v$sqlarea???where???address???=???????
- ??(???select???sql_address???from???v$session???where???sid???=???&sid???);?????
?
6.查询表的结构:表名大写!!
select t.COLUMN_NAME,
?????? t.DATA_TYPE,
?????? nvl(t.DATA_PRECISION, t.DATA_LENGTH),
?????? nvl(T.DATA_SCALE, 0),
?????? c.comments
? from all_tab_columns t, user_col_comments c
?whEre t.TABLE_NAME = c.table_name
?? and t.COLUMN_NAME = c.column_name
?? and t.TABLE_NAME = UPPER('OM_EMPLOYEE_T')
?order by t.COLUMN_ID?????
?
7.行列互换:
- 建立一个例子表:??
- CREATE?TABLE?t_col_row(???
- ID?INT,???
- c1?VARCHAR2(10),???
- c2?VARCHAR2(10),???
- c3?VARCHAR2(10));???
- INSERT?INTO?t_col_row?VALUES?(1,?'v11',?'v21',?'v31');???
- INSERT?INTO?t_col_row?VALUES?(2,?'v12',?'v22',?NULL);???
- INSERT?INTO?t_col_row?VALUES?(3,?'v13',?NULL,?'v33');???
- INSERT?INTO?t_col_row?VALUES?(4,?NULL,?'v24',?'v34');???
- INSERT?INTO?t_col_row?VALUES?(5,?'v15',?NULL,?NULL);???
- INSERT?INTO?t_col_row?VALUES?(6,?NULL,?NULL,?'v35');???
- INSERT?INTO?t_col_row?VALUES?(7,?NULL,?NULL,?NULL);???
- COMMIT;???
- ??
- 下面的是列转行:创建了一个视图??
- CREATE?view?v_row_col?AS??
- SELECT?id,?'c1'?cn,?c1?cv??
- FROM?t_col_row??
- UNION?ALL??
- SELECT?id,?'c2'?cn,?c2?cv??
- FROM?t_col_row??
- UNION?ALL??
- SELECT?id,?'c3'?cn,?c3?cv?FROM?t_col_row;??
- ??
- 下面是创建了没有空值的一个竖表:??
- CREATE?view?v_row_col_notnull?AS??
- SELECT?id,?'c1'?cn,?c1?cv??
- ?FROM?t_col_row???
- where?c1?is?not?null??
- UNION?ALL??
- SELECT?id,?'c2'?cn,?c2?cv??
- ?FROM?t_col_row??
- where?c2?is?not?null??
- UNION?ALL??
- SELECT?id,?'c3'?cn,?c3?cv??
- ?FROM?t_col_row???
- where?c3?is?not?null;??
?
8.下面可能是dba经常使用的oracle视图吧。呵呵
- 1.示例:已知hash_value:3111103299,查询sql语句:??
- select?*?from?v$sqltext???
- where?hashvalue='3111103299'??
- order?by?piece???
- 2.查看消耗资源最多的SQL:??
- SELECT?hash_value,?executions,?buffer_gets,?disk_reads,?parse_calls??
- FROM?V$SQLAREA??
- WHERE?buffer_gets?>?10000000OR?disk_reads?>?1000000??
- ORDERBY?buffer_gets?+?100?*?disk_reads?DESC;??
- ??
- 3.查看某条SQL语句的资源消耗:??
- SELECT?hash_value,?buffer_gets,?disk_reads,?executions,?parse_calls??
- FROM?V$SQLAREA??
- WHERE?hash_Value?=?228801498AND?address?=?hextoraw('CBD8E4B0');??
- ??
- 4.查询sql语句的动态执行计划:??
- ????????首先使用下面的语句找到语句的在执行计划中的address和hash_code??
- ????????SELECT?sql_text,?address,?hash_value?FROM?v$sql?t??
- ????????????????where?(sql_text?like?'%FUNCTION_T(表名大写!)%')??
- ????????然后:??
- ????????SELECT?operation,?options,?object_name,?cost?FROM?v$sql_plan??
- ????????????????WHERE?address?=?'C00000016BD6D248'?AND?hash_value?=?664376056;??
- ??
- 5.查询oracle的版本:??
- select?*?from?v$version;??
- ??
- 6.查询数据库的一些参数:??
- select?*?from?v$parameter??
- ??
- 7.查找你的session信息??
- SELECT?SID,?OSUSER,?USERNAME,?MACHINE,?PROCESS??
- FROM?V$SESSION?WHERE?audsid?=?userenv('SESSIONID');??
- ??
- 8.当machine已知的情况下查找session??
- SELECT?SID,?OSUSER,?USERNAME,?MACHINE,?TERMINAL??
- FROM?V$SESSION??
- WHERE?terminal?=?'pts/tl'?AND?machine?=?'rgmdbs1';??
- ??
- 9.查找当前被某个指定session正在运行的sql语句。假设sessionID为100??
- select?b.sql_text???
- from?v$session?a,v$sqlarea?b???
- where?a.sql_hashvalue=b.hash_value?and?a.sid=100??
?
9.树形结构connect by 排序:
- 查询树形的数据结构,同时对一层里面的数据进行排序??
- SELECT?last_name,?employee_id,?manager_id,?LEVEL??
- ??????FROM?employees??
- ??????START?WITH?employee_id?=?100??
- ??????CONNECT?BY?PRIOR?employee_id?=?manager_id??
- ?????<span?style="background-color:?#ff0000;">?ORDER?SIBLINGS?BY?last_name;</span>??
- ??
- ??
- ??
- ??
- ??
- ??
- 下面是查询结果??
- LAST_NAME?????????????????EMPLOYEE_ID?MANAGER_ID??????LEVEL??
- -------------------------?-----------?----------?----------??
- King??????????????????????????????100?????????????????????1??
- Cambrault?????????????????????????148????????100??????????2??
- Bates?????????????????????????????172????????148??????????3??
- Bloom?????????????????????????????169????????148??????????3??
- Fox???????????????????????????????170????????148??????????3??
- Kumar?????????????????????????????173????????148??????????3??
- Ozer??????????????????????????????168????????148??????????3??
- Smith?????????????????????????????171????????148??????????3??
- De?Haan???????????????????????????102????????100??????????2??
- Hunold????????????????????????????103????????102??????????3??
- Austin????????????????????????????105????????103??????????4??
- Ernst?????????????????????????????104????????103??????????4??
- Lorentz???????????????????????????107????????103??????????4??
- Pataballa?????????????????????????106????????103??????????4??
- Errazuriz?????????????????????????147????????100??????????2??
- Ande??????????????????????????????166????????147??????????3??
- Banda?????????????????????????????167????????147??????????3??
- ???
?
10.有时候写多了东西,居然还忘记最基本的sql语法,下面全部写出来,基本的oracle语句都在这里可以找到了。是很基础的语句!
- 1.在数据字典查询约束的相关信息:??
- SELECT?constraint_name,?constraint_type,search_condition??
- FROM????????user_constraints?WHERE????????table_name?=?'EMPLOYEES';??
- ????????//这里的表名都是大写!??
- 2对表结构进行说明:??
- ???desc?Tablename??
- 3查看用户下面有哪些表??
- ???select?table_name?from?user_tables;??
- 4查看约束在那个列上建立:??
- ???SELECT?constraint_name,?column_name??
- ???FROM????????user_cons_columns??
- ???WHERE??????????table_name?=?'EMPLOYEES';??
- 10结合变量查找相关某个表中约束的相关列名:??
- ??select?constraint_name,column_name?from?user_cons_columns?where?table_name?=?'&tablename'??
- 12查询数据字典看中间的元素:??
- SELECT???object_name,?object_type??
- FROM?????user_objects??
- WHERE????object_name?LIKE?'EMP%'???????
- OR???????object_name?LIKE?'DEPT%'??
- 14查询对象类型:??
- SELECT?DISTINCT?object_type?FROM???????????user_objects?;??
- 17改变对象名:(表名,视图,序列)??
- ??rename??emp?to?emp_newTable??
- 18添加表的注释:??
- ??COMMENT?ON?TABLE?employees?IS?'Employee?Information';??
- 20查看视图结构:??
- ???describe?view_name??
- 23在数据字典中查看视图信息:??
- ??select?viewe_name,text?from?user_views??
- 25查看数据字典中的序列:??
- ??select?*?from?user_sequences??
- 33得到所有的时区名字信息:??
- ????????select??*?from?v$timezone_names??
- 34显示对时区‘US/Eastern’的时区偏移量??
- ????????select?TZ_OFFSET('US/Eastern')?from?DUAL--dual英文意思是‘双重的’??
- ???显示当前会话时区中的当前日期和时间:??
- ???ALTER?SESSION?SET?NLS_DATE_FORMAT?=?'DD-MON-YYYY?HH24:MI:SS';--修改显示时间的方式的设置??
- ???ALTER?SESSION?SET?TIME_ZONE?=?'-5:0';--修改时区??
- ???SELECT?SESSIONTIMEZONE,?CURRENT_DATE?FROM?DUAL;--真正有用的语句!??
- ??SELECT?CURRENT_TIMESTAMP?FROM?DUAL;--返回的时间是当前日期和时间,含有时区??
- ??SELECT?CURRENT_TIMESTAMP?FROM?DUAL;--返回的时间是当前日期和时间,不含有时区!!!????
- 35显示数据库时区和会话时区的值:??
- ????????select?datimezone,sessiontimezone?from?dual;??
- ??
- 13普通的建表语句:??
- CREATE?TABLE?dept??
- (deptno?????????NUMBER(2),??
- dname?????????VARCHAR2(14),??
- loc?????????VARCHAR2(13));??
- 15使用子查询建立表:??
- ?CREATE?TABLE?????????dept80??
- ??AS??SELECT??employee_id,?last_name,???
- ????????????salary*12?ANNSAL,???
- ????????????hire_date???FROM????employees???WHERE???department_id?=?80;??
- 6添加列://?alter?table?EMP?add?column?(dept_id?number(7));错误!!??
- ??alter?table?EMP?add?(dept_id?number(7));??
- 7删除一列:??
- ??alter?table?emp?drop?column?dept_id;??
- 8添加列名同时和约束:??
- ?alter?table?EMP?add?(dept_id?number(7)???
- ???constraint?my_emp_dept_id_fk??references?dept(ID));??
- 9改变列://注意约束不能够修改?的!!??
- ?alter?table?dept80?modify(last_name?varchar2(30));//这里使用的是modify而不是alter!??
- 24增加一行:??
- ??insert?into?table_name?values();??
- ??
- 5添加主键:??
- ?alter?Table?EMP??add?constraint?my_emp_id_pk?primary?key?(ID);??
- 11添加一个有check约束的新列:??
- ??alter?table?EMP??
- ??add?(COMMISSION?number(2)?constraint?emp_commission_ck?check(commission>0))??
- 16删除表:??
- ???drop?table?emp;??
- 19创建视图:??
- ???CREATE?VIEW?????????empvu80??
- ?AS?SELECT??employee_id,?last_name,?salary??
- ????FROM????employees?????WHERE???department_id?=?80;??
- 21删除视图:??
- ???drop?view?view_name??
- 22找到工资最高的5个人。(top-n分析)(行内视图)??
- ?select?rownum,employee_id?from?(select?employee_id,salary?from??
- ?employees?order?by?salary?desc)??
- ??where?rownum<5;??
- 26建立同义词:??
- ??create?synonym?同义词名?for?原来的名字??
- 或者??create?public?synonym?同义词名?for?原来的名字??
- 27建立序列:(注意,这里并没有出现说是哪个表里面的序列!!)??
- ??CREATE?SEQUENCE?dept_deptid_seq??
- ????????????????INCREMENT?BY?10??
- ????????????????START?WITH?120??
- ????????????????MAXVALUE?9999??
- ????????????????NOCACHE??
- ????????????????NOCYCLE????
- 28使用序列:??
- ????????insert?into?dept(ID,NAME)?values(DEPT_ID_SEQ.nextval,'Administration');??
- 29建立索引://默认就是nonunique索引,除非使用了关键字:unique??
- ????????CREATE?INDEX?emp_last_name_idx?ON?employees(last_name);??
- 30建立用户:(可能有错,详细查看帮助)??
- ????????create?user??username(用户名)??
- ????????identified?by?oracle(密码)??
- ????????default?tablespace??data01(表空间名//默认存在system表空间里面)??
- ????????quota?10M(设置大小,最大为unlimited)??on?表空间名//必须分配配额!??
- 31创建角色:create?ROLE?manager??
- ????赋予角色权限:grant?create?table,create?view?to?manage??
- ????赋予用户角色:grant?manager?to?DENHAAN,KOCHHAR(?两个用户)??
- 32分配权限:??
- ????????GRANT??update?(department_name,?location_id)??
- ????????ON?????departments??
- ????????TO?????scott,?manager;??
- ????回收权限??
- ????????REVOKE??select,?insert??
- ????????ON??????departments??
- ????????FROM????scott;??
- 36从时间中提取年,月,日:使用函数extract??
- ????????select?extract(year?from?sysdate)?year,extract(month?from?sysdate),??
- extract(day?from?sysdate)?from?dual;??
- 37使用函数得到数月之后的日期:to_yminterval(‘01-02’)表示加上1年2月,不能够到天!!??
- ????????select?hire_date,hire_date?+to_yminterval('01-02')?as?hire_date_new?from?employees?where?department_id=20??
- ????得到多少天之后的日期:直接日期加数字!??
- ????????select?hire_date?+3?from?employees?where?department_id=20??
- 38一般的时间函数:??
- ????????MONTHS_BETWEEN?('01-SEP-95','11-JAN-94')--两个日期之间的月数,返回一个浮点数??
- ????????ADD_MONTHS?('11-JAN-94',6)--添加月数??
- ??????????NEXT_DAY?('01-SEP-95','FRIDAY')?--下一个星期五的日期??
- ????????LAST_DAY('01-FEB-95')--当月的最后一天!??
- ????????ROUND(SYSDATE,'MONTH')?????????--四舍五入月??
- ????????ROUND(SYSDATE?,'YEAR')???????--四舍五入年??
- ????????TRUNC(SYSDATE?,'MONTH')????????--阶段月??
- ?????????TRUNC(SYSDATE?,'YEAR')????????--截断年????
- 39?group语句:和高级的应用语句:??
- ????????SELECT???department_id,?job_id,?SUM(salary),??COUNT(employee_id)?FROM?????employees??
- ????????????????GROUP?BY?department_id,?job_id?;??
- ????????使用having进行约束:??
- ????????1.group?by?rollup:对n列组合得到n+1种情况??
- ????????SELECT???department_id,?job_id,?SUM(salary)????????FROM?????employees??WHERE????department_id?<?60?GROUP?BY?ROLLUP(department_id,?job_id);??
- ????????2.group?by?cube:得到2的n次方种情况??
- ????????SELECT???department_id,?job_id,?SUM(salary)?FROM?????employees??WHERE????department_id?<?60?GROUP?BY?CUBE?(department_id,?job_id)?;??
- ????????3.使用grouping得到一行中构成列的情况,只是返回1和0:是空的话就返回1,否则返回0(注意不要弄反了!)??
- ????????SELECT???department_id?DEPTID,?job_id?JOB,??SUM(salary),????GROUPING(department_id)?GRP_DEPT,????GROUPING(job_id)?GRP_JOB??
- ????????????????FROM?????employees?WHERE????department_id?<?50?GROUP?BY?ROLLUP(department_id,?job_id);??
- ????????4.grouping?sets:根据需要得到制定的组合情况??
- ????????SELECT???department_id,?job_id,?manager_id,avg(salary)?FROM?????employees?GROUP?BY?GROUPING?SETS?((department_id,job_id),?(job_id,manager_id));??
- 40from中使用子查询:返回每个部门中大于改部门平均工资的与员工信息??
- ????????SELECT??a.last_name,?a.salary,?a.department_id,?b.salavg??FROM????employees?a,--下面的地方就是子查询了,主要返回的是一组数据!??
- ?????????(SELECT???department_id,?AVG(salary)?salavg???FROM?????employees??GROUP?BY?department_id)?b??
- ????????WHERE???a.department_id?=?b.department_id??
- ????????AND?????a.salary?>?b.salavg;??
- 41exists语句的使用:??
- ????????SELECT?employee_id,?last_name,?job_id,?department_id??
- ????????FROM???employees?outer--下面的?exists里面的select选择出来的是随便的一个字符或者数字都可以??
- ????????WHERE??EXISTS?(?SELECT?'X'???FROM???employees?WHERE??manager_id?=??outer.employee_id);??
- 42厉害的with语句:??
- ????????WITH???
- ?????????dept_costs??AS?(--定义了一个临时的表??
- ???????????????????SELECT??d.department_name,?SUM(e.salary)?AS?dept_total--其间定义了一个临时的列dept_total??
- ???????????????????FROM????employees?e,?departments?d??
- ???????????????????WHERE???e.department_id?=?d.department_id??
- ???????????????????GROUP?BY?d.department_name),/*注意这里有逗号*/??
- ????????avg_cost????AS?(??
- ???????????SELECT?SUM(dept_total)/COUNT(*)?AS?dept_avg??
- ???????????FROM???dept_costs)--这里的第二张临时表里面就引用了前面定义的临时表和之间的列!??
- ????????SELECT?*??FROM???dept_costs??WHERE??dept_total?>??(SELECT?dept_avg???FROM?avg_cost)?ORDER?BY?department_name;---最后的查询语句中使用了前面的临时表??
- 43遍历树:??
- ????????SELECT?employee_id,?last_name,?job_id,?manager_id??
- ????????FROM???employees??
- ????????START??WITH??employee_id?=?101??
- ????????CONNECT?BY?PRIOR?manager_id?=?employee_id?;--自底向上的遍历树。??
- ??
- 44.更新语句??
- UPDATE?employees?SET???
- ????job_id?=?'SA_MAN',?salary?=?salary?+?1000,?department_id?=?120???
- ????WHERE?first_name||'?'||last_name?=?'Douglas?Grant';???
- ??
- UPDATE?TABLE?(SELECT?projs???
- ???????????FROM?dept?d?WHERE?d.dno?=?123)??p???
- ??SET?p.budgets?=?p.budgets?+?1???
- ??WHERE?p.pno?IN?(123,?456);??
?
11.导入导出dmp文件:
imp [email protected] ignore=y file=备份文件 log=D:\DBtest\db_bak\imp.log
?
exp [email protected] file=d:\daochu.dmp full=y
?
?12.大对象字段blob:查看blob字段的大小:
?? select??dbms_lob.getLength?(字段名)??from?表名?;?
?
13.下面收集的是有意思的sql语句,说不定正是你需要的:
?
- --创建一个只允许在工作时间访问的视图??
- create?or?replace?view?newviewemp??
- as??
- select?*?from?表名??
- ?where?exists(select?1?from?dual?where?sysdate?>=??
- ???????to_date(to_char(sysdate,?'yyyy-mm-dd?')?||?'08:00:00',?'yyyy-mm-dd?hh24:mi:ss')??
- ???and?sysdate?<??
- ???????to_date(to_char(sysdate,?'yyyy-mm-dd?')?||?'18:00:00',?'yyyy-mm-dd?hh24:mi:ss'))??
- ???
?
14.存储过程中执行ddl语句:
Create Or Replace Procedure My_Proc As
Sqlddl Varchar2(1000);
Begin
Sqlddl := 'create table MyTable(ID Number(5), Name Varchar2(20))';
Dbms_Output.Put_Line(Sqlddl);
Execute Immediate Sqlddl;?
End;