瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          轉載一篇文章oracle的一些操作

          Posted on 2011-08-03 10:33 瘋狂 閱讀(922) 評論(0)  編輯  收藏 所屬分類: databasejava性能
          轉自: http://renjie120.iteye.com/

          注意:數據庫版本是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.關于查詢數據庫用戶,權限的相關語句:

          Sql代碼 復制代碼 收藏代碼
          1. 1.查看所有用戶:   
          2. select * from dba_user;   
          3. select * from all_users;   
          4. select * from user_users;   
          5.   
          6.   
          7. 2.查看用戶系統權限:   
          8. select * from dba_sys_privs;   
          9. select * from all_sys_privs;   
          10. select * from user_sys_privs;   
          11.   
          12.   
          13. 3.查看用戶對象權限:   
          14. select * from dba_tab_privs;   
          15. select * from all_tab_privs;   
          16. select * from user_tab_privs;   
          17.   
          18.   
          19. 4.查看所有角色:   
          20. select * from dba_roles;   
          21.   
          22.   
          23. 5.查看用戶所擁有的角色:   
          24. select * from dba_role_privs;   
          25. select * from user_role_privs;  

           

          4.幾個經常用到的oracle視圖:注意表名使用大寫....................

          Sql代碼 復制代碼 收藏代碼
          1. 1. 查詢oracle中所有用戶信息   
          2.        select  * from dba_user;   
          3.    2. 只查詢用戶和密碼   
          4.        select username,password from dba_users;   
          5.    3. 查詢當前用戶信息   
          6.        select * from dba_ustats;   
          7.    4. 查詢用戶可以訪問的視圖文本   
          8.        select * from dba_varrays;   
          9.    5. 查詢數據庫中所有視圖的文本   
          10.        select * from dba_views;   
          11. 6.查詢全部索引    
          12. select * from user_indexes;   
          13. 查詢全部表格   
          14.       select * from user_tables;   
          15.          查詢全部約束   
          16.       select * from user_constraints;   
          17.           查詢全部對象   
          18.       select * from user_objects;  

           

          5.查看當前數據庫中正在執行的語句,然后可以繼續做很多很多事情,例如查詢執行計劃等等

          Sql代碼 復制代碼 收藏代碼
          1. (1).查看相關進程在數據庫中的會話      
          2.   Select   a.sid,a.serial#,a.program,   a.status   ,      
          3.   substr(a.machine,1,20),   a.terminal,b.spid      
          4.   from   v$session   a,   v$process   b      
          5.   where   a.paddr=b.addr      
          6.   and   b.spid   =   &spid;      
          7.        
          8.   (2).查看數據庫中被鎖住的對象和相關會話      
          9.   select   a.sid,a.serial#,a.username,a.program,      
          10.   c.owner,   c.object_name        
          11.   from   v$session   a,   v$locked_object   b,   all_objects   c      
          12.   where   a.sid=b.session_id   and      
          13.   c.object_id   =   b.object_id;      
          14.        
          15.   (3).查看相關會話正在執行的SQL      
          16.   select   sql_text   from   v$sqlarea   where   address   =        
          17.   (   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.行列互換:

          Sql代碼 復制代碼 收藏代碼
          1. 建立一個例子表:   
          2. CREATE TABLE t_col_row(    
          3. ID INT,    
          4. c1 VARCHAR2(10),    
          5. c2 VARCHAR2(10),    
          6. c3 VARCHAR2(10));    
          7. INSERT INTO t_col_row VALUES (1, 'v11''v21''v31');    
          8. INSERT INTO t_col_row VALUES (2, 'v12''v22'NULL);    
          9. INSERT INTO t_col_row VALUES (3, 'v13'NULL'v33');    
          10. INSERT INTO t_col_row VALUES (4, NULL'v24''v34');    
          11. INSERT INTO t_col_row VALUES (5, 'v15'NULLNULL);    
          12. INSERT INTO t_col_row VALUES (6, NULLNULL'v35');    
          13. INSERT INTO t_col_row VALUES (7, NULLNULLNULL);    
          14. COMMIT;    
          15.   
          16. 下面的是列轉行:創建了一個視圖   
          17. CREATE view v_row_col AS  
          18. SELECT id, 'c1' cn, c1 cv   
          19. FROM t_col_row   
          20. UNION ALL  
          21. SELECT id, 'c2' cn, c2 cv   
          22. FROM t_col_row   
          23. UNION ALL  
          24. SELECT id, 'c3' cn, c3 cv FROM t_col_row;   
          25.   
          26. 下面是創建了沒有空值的一個豎表:   
          27. CREATE view v_row_col_notnull AS  
          28. SELECT id, 'c1' cn, c1 cv   
          29.  FROM t_col_row    
          30. where c1 is not null  
          31. UNION ALL  
          32. SELECT id, 'c2' cn, c2 cv   
          33.  FROM t_col_row   
          34. where c2 is not null  
          35. UNION ALL  
          36. SELECT id, 'c3' cn, c3 cv   
          37.  FROM t_col_row    
          38. where c3 is not null;  

           

          8.下面可能是dba經常使用的oracle視圖吧。呵呵

          Sql代碼 復制代碼 收藏代碼
          1. 1.示例:已知hash_value:3111103299,查詢sql語句:   
          2. select * from v$sqltext    
          3. where hashvalue='3111103299'  
          4. order by piece    
          5. 2.查看消耗資源最多的SQL:   
          6. SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls   
          7. FROM V$SQLAREA   
          8. WHERE buffer_gets > 10000000OR disk_reads > 1000000   
          9. ORDERBY buffer_gets + 100 * disk_reads DESC;   
          10.   
          11. 3.查看某條SQL語句的資源消耗:   
          12. SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls   
          13. FROM V$SQLAREA   
          14. WHERE hash_Value = 228801498AND address = hextoraw('CBD8E4B0');   
          15.   
          16. 4.查詢sql語句的動態執行計劃:   
          17.         首先使用下面的語句找到語句的在執行計劃中的address和hash_code   
          18.         SELECT sql_text, address, hash_value FROM v$sql t   
          19.                 where (sql_text like '%FUNCTION_T(表名大寫!)%')   
          20.         然后:   
          21.         SELECT operation, options, object_name, cost FROM v$sql_plan   
          22.                 WHERE address = 'C00000016BD6D248' AND hash_value = 664376056;   
          23.   
          24. 5.查詢oracle的版本:   
          25. select * from v$version;   
          26.   
          27. 6.查詢數據庫的一些參數:   
          28. select * from v$parameter   
          29.   
          30. 7.查找你的session信息   
          31. SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS   
          32. FROM V$SESSION WHERE audsid = userenv('SESSIONID');   
          33.   
          34. 8.當machine已知的情況下查找session   
          35. SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL   
          36. FROM V$SESSION   
          37. WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';   
          38.   
          39. 9.查找當前被某個指定session正在運行的sql語句。假設sessionID為100   
          40. select b.sql_text    
          41. from v$session a,v$sqlarea b    
          42. where a.sql_hashvalue=b.hash_value and a.sid=100  

           

          9.樹形結構connect by 排序:

          Sql代碼 復制代碼 收藏代碼
          1. 查詢樹形的數據結構,同時對一層里面的數據進行排序   
          2. SELECT last_name, employee_id, manager_id, LEVEL  
          3.       FROM employees   
          4.       START WITH employee_id = 100   
          5.       CONNECT BY PRIOR employee_id = manager_id   
          6.      <SPAN style="BACKGROUND-COLOR: #ff0000"ORDER SIBLINGS BY last_name;</SPAN>   
          7.   
          8.   
          9.   
          10.   
          11.   
          12.   
          13. 下面是查詢結果   
          14. LAST_NAME                 EMPLOYEE_ID MANAGER_ID      LEVEL  
          15. ------------------------- ----------- ---------- ----------   
          16. King                              100                     1   
          17. Cambrault                         148        100          2   
          18. Bates                             172        148          3   
          19. Bloom                             169        148          3   
          20. Fox                               170        148          3   
          21. Kumar                             173        148          3   
          22. Ozer                              168        148          3   
          23. Smith                             171        148          3   
          24. De Haan                           102        100          2   
          25. Hunold                            103        102          3   
          26. Austin                            105        103          4   
          27. Ernst                             104        103          4   
          28. Lorentz                           107        103          4   
          29. Pataballa                         106        103          4   
          30. Errazuriz                         147        100          2   
          31. Ande                              166        147          3   
          32. Banda                             167        147          3   
          33.    

           

          10.有時候寫多了東西,居然還忘記最基本的sql語法,下面全部寫出來,基本的oracle語句都在這里可以找到了。是很基礎的語句!

          Sql代碼 復制代碼 收藏代碼
          1. 1.在數據字典查詢約束的相關信息:   
          2. SELECT constraint_name, constraint_type,search_condition   
          3. FROM        user_constraints WHERE        table_name = 'EMPLOYEES';   
          4.         //這里的表名都是大寫!   
          5. 2對表結構進行說明:   
          6.    desc Tablename   
          7. 3查看用戶下面有哪些表   
          8.    select table_name from user_tables;   
          9. 4查看約束在那個列上建立:   
          10.    SELECT constraint_name, column_name   
          11.    FROM        user_cons_columns   
          12.    WHERE          table_name = 'EMPLOYEES';   
          13. 10結合變量查找相關某個表中約束的相關列名:   
          14.   select constraint_name,column_name from user_cons_columns where table_name = '&tablename'  
          15. 12查詢數據字典看中間的元素:   
          16. SELECT   object_name, object_type   
          17. FROM     user_objects   
          18. WHERE    object_name LIKE 'EMP%'        
          19. OR       object_name LIKE 'DEPT%'  
          20. 14查詢對象類型:   
          21. SELECT DISTINCT object_type FROM           user_objects ;   
          22. 17改變對象名:(表名,視圖,序列)   
          23.   rename  emp to emp_newTable   
          24. 18添加表的注釋:   
          25.   COMMENT ON TABLE employees IS 'Employee Information';   
          26. 20查看視圖結構:   
          27.    describe view_name   
          28. 23在數據字典中查看視圖信息:   
          29.   select viewe_name,text from user_views   
          30. 25查看數據字典中的序列:   
          31.   select * from user_sequences   
          32. 33得到所有的時區名字信息:   
          33.         select  * from v$timezone_names   
          34. 34顯示對時區‘US/Eastern’的時區偏移量   
          35.         select TZ_OFFSET('US/Eastern'from DUAL--dual英文意思是‘雙重的’   
          36.    顯示當前會話時區中的當前日期和時間:   
          37.    ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';--修改顯示時間的方式的設置   
          38.    ALTER SESSION SET TIME_ZONE = '-5:0';--修改時區   
          39.    SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;--真正有用的語句!   
          40.   SELECT CURRENT_TIMESTAMP FROM DUAL;--返回的時間是當前日期和時間,含有時區   
          41.   SELECT CURRENT_TIMESTAMP FROM DUAL;--返回的時間是當前日期和時間,不含有時區?。?!     
          42. 35顯示數據庫時區和會話時區的值:   
          43.         select datimezone,sessiontimezone from dual;   
          44.   
          45. 13普通的建表語句:   
          46. CREATE TABLE dept   
          47. (deptno         NUMBER(2),   
          48. dname         VARCHAR2(14),   
          49. loc         VARCHAR2(13));   
          50. 15使用子查詢建立表:   
          51.  CREATE TABLE         dept80   
          52.   AS  SELECT  employee_id, last_name,    
          53.             salary*12 ANNSAL,    
          54.             hire_date   FROM    employees   WHERE   department_id = 80;   
          55. 6添加列:// alter table EMP add column (dept_id number(7));錯誤!!   
          56.   alter table EMP add (dept_id number(7));   
          57. 7刪除一列:   
          58.   alter table emp drop column dept_id;   
          59. 8添加列名同時和約束:   
          60.  alter table EMP add (dept_id number(7)    
          61.    constraint my_emp_dept_id_fk  references dept(ID));   
          62. 9改變列://注意約束不能夠修改 的?。?  
          63.  alter table dept80 modify(last_name varchar2(30));//這里使用的是modify而不是alter!   
          64. 24增加一行:   
          65.   insert into table_name values();   
          66.   
          67. 5添加主鍵:   
          68.  alter Table EMP  add constraint my_emp_id_pk primary key (ID);   
          69. 11添加一個有check約束的新列:   
          70.   alter table EMP   
          71.   add (COMMISSION number(2) constraint emp_commission_ck check(commission>0))   
          72. 16刪除表:   
          73.    drop table emp;   
          74. 19創建視圖:   
          75.    CREATE VIEW         empvu80   
          76.  AS SELECT  employee_id, last_name, salary   
          77.     FROM    employees     WHERE   department_id = 80;   
          78. 21刪除視圖:   
          79.    drop view view_name   
          80. 22找到工資最高的5個人。(top-n分析)(行內視圖)   
          81.  select rownum,employee_id from (select employee_id,salary from  
          82.  employees order by salary desc)   
          83.   where rownum<5;   
          84. 26建立同義詞:   
          85.   create synonym 同義詞名 for 原來的名字   
          86. 或者  create public synonym 同義詞名 for 原來的名字   
          87. 27建立序列:(注意,這里并沒有出現說是哪個表里面的序列?。。?  
          88.   CREATE SEQUENCE dept_deptid_seq   
          89.                 INCREMENT BY 10   
          90.                 START WITH 120   
          91.                 MAXVALUE 9999   
          92.                 NOCACHE   
          93.                 NOCYCLE     
          94. 28使用序列:   
          95.         insert into dept(ID,NAMEvalues(DEPT_ID_SEQ.nextval,'Administration');   
          96. 29建立索引://默認就是nonunique索引,除非使用了關鍵字:unique  
          97.         CREATE INDEX emp_last_name_idx ON employees(last_name);   
          98. 30建立用戶:(可能有錯,詳細查看幫助)   
          99.         create user  username(用戶名)   
          100.         identified by oracle(密碼)   
          101.         default tablespace  data01(表空間名//默認存在system表空間里面)   
          102.         quota 10M(設置大小,最大為unlimited)  on 表空間名//必須分配配額!   
          103. 31創建角色:create ROLE manager   
          104.     賦予角色權限:grant create table,create view to manage   
          105.     賦予用戶角色:grant manager to DENHAAN,KOCHHAR( 兩個用戶)   
          106. 32分配權限:   
          107.         GRANT  update (department_name, location_id)   
          108.         ON     departments   
          109.         TO     scott, manager;   
          110.     回收權限   
          111.         REVOKE  selectinsert  
          112.         ON      departments   
          113.         FROM    scott;   
          114. 36從時間中提取年,月,日:使用函數extract   
          115.         select extract(year from sysdate) year,extract(month from sysdate),   
          116. extract(day from sysdate) from dual;   
          117. 37使用函數得到數月之后的日期:to_yminterval(‘01-02’)表示加上1年2月,不能夠到天?。?  
          118.         select hire_date,hire_date +to_yminterval('01-02'as hire_date_new from employees where department_id=20   
          119.     得到多少天之后的日期:直接日期加數字!   
          120.         select hire_date +3 from employees where department_id=20   
          121. 38一般的時間函數:   
          122.         MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')--兩個日期之間的月數,返回一個浮點數   
          123.         ADD_MONTHS ('11-JAN-94',6)--添加月數   
          124.           NEXT_DAY ('01-SEP-95','FRIDAY'--下一個星期五的日期   
          125.         LAST_DAY('01-FEB-95')--當月的最后一天!   
          126.         ROUND(SYSDATE,'MONTH')         --四舍五入月   
          127.         ROUND(SYSDATE ,'YEAR')       --四舍五入年   
          128.         TRUNC(SYSDATE ,'MONTH')        --階段月   
          129.          TRUNC(SYSDATE ,'YEAR')        --截斷年     
          130. 39 group語句:和高級的應用語句:   
          131.         SELECT   department_id, job_id, SUM(salary),  COUNT(employee_id) FROM     employees   
          132.                 GROUP BY department_id, job_id ;   
          133.         使用having進行約束:   
          134.         1.group by rollup:對n列組合得到n+1種情況   
          135.         SELECT   department_id, job_id, SUM(salary)        FROM     employees  WHERE    department_id < 60 GROUP BY ROLLUP(department_id, job_id);   
          136.         2.group by cube:得到2的n次方種情況   
          137.         SELECT   department_id, job_id, SUM(salary) FROM     employees  WHERE    department_id < 60 GROUP BY CUBE (department_id, job_id) ;   
          138.         3.使用grouping得到一行中構成列的情況,只是返回1和0:是空的話就返回1,否則返回0(注意不要弄反了!)   
          139.         SELECT   department_id DEPTID, job_id JOB,  SUM(salary),    GROUPING(department_id) GRP_DEPT,    GROUPING(job_id) GRP_JOB   
          140.                 FROM     employees WHERE    department_id < 50 GROUP BY ROLLUP(department_id, job_id);   
          141.         4.grouping sets:根據需要得到制定的組合情況   
          142.         SELECT   department_id, job_id, manager_id,avg(salary) FROM     employees GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));   
          143. 40from中使用子查詢:返回每個部門中大于改部門平均工資的與員工信息   
          144.         SELECT  a.last_name, a.salary, a.department_id, b.salavg  FROM    employees a,--下面的地方就是子查詢了,主要返回的是一組數據!   
          145.          (SELECT   department_id, AVG(salary) salavg   FROM     employees  GROUP BY department_id) b   
          146.         WHERE   a.department_id = b.department_id   
          147.         AND     a.salary > b.salavg;   
          148. 41exists語句的使用:   
          149.         SELECT employee_id, last_name, job_id, department_id   
          150.         FROM   employees outer--下面的 exists里面的select選擇出來的是隨便的一個字符或者數字都可以   
          151.         WHERE  EXISTS ( SELECT 'X'   FROM   employees WHERE  manager_id =  outer.employee_id);   
          152. 42厲害的with語句:   
          153.         WITH    
          154.          dept_costs  AS (--定義了一個臨時的表   
          155.                    SELECT  d.department_name, SUM(e.salary) AS dept_total--其間定義了一個臨時的列dept_total   
          156.                    FROM    employees e, departments d   
          157.                    WHERE   e.department_id = d.department_id   
          158.                    GROUP BY d.department_name),/*注意這里有逗號*/   
          159.         avg_cost    AS (   
          160.            SELECT SUM(dept_total)/COUNT(*) AS dept_avg   
          161.            FROM   dept_costs)--這里的第二張臨時表里面就引用了前面定義的臨時表和之間的列!   
          162.         SELECT *  FROM   dept_costs  WHERE  dept_total >  (SELECT dept_avg   FROM avg_cost) ORDER BY department_name;---最后的查詢語句中使用了前面的臨時表   
          163. 43遍歷樹:   
          164.         SELECT employee_id, last_name, job_id, manager_id   
          165.         FROM   employees   
          166.         START  WITH  employee_id = 101   
          167.         CONNECT BY PRIOR manager_id = employee_id ;--自底向上的遍歷樹。   
          168.   
          169. 44.更新語句   
          170. UPDATE employees SET    
          171.     job_id = 'SA_MAN', salary = salary + 1000, department_id = 120    
          172.     WHERE first_name||' '||last_name = 'Douglas Grant';    
          173.   
          174. UPDATE TABLE (SELECT projs    
          175.            FROM dept d WHERE d.dno = 123)  p    
          176.   SET p.budgets = p.budgets + 1    
          177.   WHERE p.pno IN (123, 456);  

           

          11.導入導出dmp文件:

          imp 用戶名/密碼@數據庫 ignore=y file=備份文件 log=D:\DBtest\db_bak\imp.log

           

          exp system/manager@TEST file=d:\daochu.dmp full=y

           

           12.大對象字段blob:查看blob字段的大小:

             select  dbms_lob.getLength (字段名)  from 表名 ; 

           

          13.下面收集的是有意思的sql語句,說不定正是你需要的:

           

          Java代碼 復制代碼 收藏代碼
          1. --創建一個只允許在工作時間訪問的視圖   
          2. create or replace view newviewemp   
          3. as   
          4. select * from 表名   
          5.  where exists(select 1 from dual where sysdate >=   
          6.        to_date(to_char(sysdate, 'yyyy-mm-dd ') || '08:00:00''yyyy-mm-dd hh24:mi:ss')   
          7.    and sysdate <   
          8.        to_date(to_char(sysdate, 'yyyy-mm-dd ') || '18:00:00''yyyy-mm-dd hh24:mi:ss'))   
          9.    

           

          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;

          主站蜘蛛池模板: 南宫市| 巫山县| 东乌珠穆沁旗| 金乡县| 镇雄县| 石屏县| 沛县| 新密市| 吉隆县| 黑龙江省| 镇雄县| 香河县| 舒兰市| 林州市| 龙海市| 民县| 台山市| 峡江县| 固阳县| 福州市| 绥中县| 银川市| 陕西省| 开封县| 阜新市| 江达县| 杭州市| 普安县| 大连市| 岳池县| 搜索| 伊川县| 德昌县| 西乌珠穆沁旗| 武平县| 江门市| 大渡口区| 麦盖提县| 大石桥市| 龙海市| 灌云县|