Oracle數據操作腳本

------------------------------------------------------關於sql------------------------------------------------
--1.批量生成sql語句(檢測表中主鍵字段作於是否含有空格)
select 'select * from ' || b.table_name || ' where ' ||'substr('||b.column_name||',0,1)='' '' ' || 'or substr('||b.column_name ||',length('||b.column_name||'),1)='' '''
from user_constraints a,user_cons_columns b
where a.CONSTRAINT_NAME = b.constraint_name
      AND a.CONSTRAINT_TYPE = 'P'
      AND b.constraint_name not like 'SYS%'
      AND b.table_name IN (select TABLE_NAME from user_tables)
ORDER BY b.TABLE_NAME
--2.關於鎖表問題的解決:
    select * from v$locked_object ;--查看被鎖定的數據,得到object_id在dba_objects中可以查看出來被鎖定的表
    select * from dba_objects where object_id ='119689';--可以看出來哪個表被鎖住
    select * from v$session where  sid =371;--從v$locked_object得到sid
    alter system kill session '371,274';--傳入sid和serial
--3.修改
    a.修改約束(先增後刪):
    b.修改表中子段類型:
        b1.alter table code_cwxxb modify hlks varchar2(4);--將表code_cwwxxb中hlks字段類型改爲:varchar2(4)
        b2.修改char類型爲varchar類型(使用轉換的思想)--先改名,再添加,後賦值,最後刪除
            alter table zy_cnext_hf rename column hlks to hlks_back
            alter table zy_cnext_hf a a.hlks varchar2(4)
            update zy_cnext_hf a set a.hlks=(select trim(b.hlks_back) from zy_cnext_hf b where a.rowid=b.rowid)
            alter table zy_cnext_hf drop column hlks_back
--4.關於oracle中的系統表:注意(對於字段區分大小寫)
    select * from user_tables --查出該登陸用戶系統中的所有表
    select * from user_tab_columns-- 查出登陸用戶系統中所有表的列
    select * from dba_tables --查詢系統中所有的表
--5.關於系統表的比對:
    --1>.缺少的表
SELECT C.*
  FROM (SELECT A.TABLE_NAME A_TABLE,
               B.TABLE_NAME B_TABLE
          FROM (SELECT TABLE_NAME
                  FROM Dba_Tables
                  WHERE OWNER = 'TPHIS_TH'  --用標準庫代替
                       AND TABLE_NAME NOT LIKE ('STU%')
                       AND TABLE_NAME NOT LIKE ('T_CON%')
                       AND TABLE_NAME NOT LIKE ('KC%')
                       AND TABLE_NAME NOT LIKE ('WJDM%')
                       AND TABLE_NAME NOT LIKE ('CWTJ%')) A
                LEFT JOIN
                (SELECT TABLE_NAME
                   FROM Dba_Tables
                   WHERE OWNER = 'TPHIS_MC' --用被比較的庫代替
                       AND TABLE_NAME NOT LIKE ('STU%')
                       AND TABLE_NAME NOT LIKE ('T_CON%')
                       AND TABLE_NAME NOT LIKE ('KC%')
                       AND TABLE_NAME NOT LIKE ('WJDM%')
                       AND TABLE_NAME NOT LIKE ('CWTJ%')) B
                  ON A.TABLE_NAME = B.TABLE_NAME) C
WHERE C.B_TABLE IS NULL  
ORDER BY C.A_TABLE

    --2>.缺少的視圖或視圖的內容不一致
SELECT C.*
  FROM (SELECT A.VIEW_NAME   A_VIEW,
               A.TEXT_LENGTH A_TEXT_LENGTH,
               B.VIEW_NAME   B_VIEW,
               B.TEXT_LENGTH B_TEXT_LENGTH              
          FROM (SELECT VIEW_NAME,TEXT_LENGTH
                  FROM DBA_VIEWS
                  WHERE OWNER = 'TPHIS_TH'  --用標準庫代替
               ) A
               LEFT JOIN
               (SELECT VIEW_NAME,TEXT_LENGTH
                   FROM DBA_VIEWS
                   WHERE OWNER = 'TPHIS_MC' --用被比較的庫代替
               ) B
               ON A.VIEW_NAME = B.VIEW_NAME) C
WHERE C.B_VIEW IS NULL OR C.A_TEXT_LENGTH <> C.B_TEXT_LENGTH 
ORDER BY C.A_VIEW

    --3>.缺少字段或類型不同或長度不同
SELECT C.* --DISTINCT C.A_TABLE
   FROM (SELECT  A.TABLE_NAME  AS A_TABLE,
                 A.COLUMN_NAME AS A_COL,
                 A.DATA_TYPE   AS A_TPYE,
                 A.DATA_LENGTH AS A_LEN,     
                 B.TABLE_NAME  AS B_TABLE,
                 B.COLUMN_NAME AS B_COL,
                 B.DATA_TYPE   AS B_TPYE,
                 B.DATA_LENGTH AS B_LEN                  
            FROM (SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE,DATA_LENGTH
                    FROM Dba_Tab_Columns
                    WHERE OWNER = 'TPHIS_TH'  --用標準庫代替
                         AND TABLE_NAME NOT LIKE ('STU%')
                         AND TABLE_NAME NOT LIKE ('T_CON%')
                         AND TABLE_NAME NOT LIKE ('KC%')
                         AND TABLE_NAME NOT LIKE ('WJDM%')
                         AND TABLE_NAME NOT LIKE ('CWTJ%')) A
                  LEFT JOIN
                  (SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE,DATA_LENGTH
                     FROM Dba_Tab_Columns
                     WHERE OWNER = 'TPHIS_MC'  --用被比較的庫代替
                         AND TABLE_NAME NOT LIKE ('STU%')
                         AND TABLE_NAME NOT LIKE ('T_CON%')
                         AND TABLE_NAME NOT LIKE ('KC%')
                         AND TABLE_NAME NOT LIKE ('WJDM%')
                         AND TABLE_NAME NOT LIKE ('CWTJ%')) B
                   ON A.COLUMN_NAME = B.COLUMN_NAME
                        AND A.TABLE_NAME=B.TABLE_NAME ) C
     WHERE  C.B_COL IS NULL OR (C.A_TPYE<>C.B_TPYE OR C.A_LEN <> C.B_LEN ) 
     ORDER BY C.A_TABLE,C.A_COL
    


    --4>.表中缺少存儲
SELECT C.A_NAME, C.B_NAME
  FROM (SELECT A.NAME A_NAME, B.NAME B_NAME
          FROM (SELECT  DISTINCT NAME
                  FROM DBA_SOURCE
                 WHERE OWNER = 'TPHIS_TH'  --用標準庫代替
                   AND TYPE = 'PROCEDURE') A
                LEFT JOIN
               (SELECT  DISTINCT NAME
                   FROM DBA_SOURCE
                   WHERE OWNER = 'TPHIS_MC'  --用被比較的庫代替
                       AND TYPE = 'PROCEDURE') B
               ON A.NAME = B.NAME) C
WHERE C.B_NAME IS NULL
ORDER BY C.A_NAME

    --5>.表中缺少函數
SELECT C.A_NAME, C.B_NAME
  FROM (SELECT A.NAME A_NAME, B.NAME B_NAME
          FROM (SELECT  DISTINCT NAME
                  FROM DBA_SOURCE
                 WHERE OWNER = 'TPHIS_TH'  --用標準庫代替
                       AND TYPE = 'FUNCTION') A
                LEFT JOIN
               (SELECT  DISTINCT NAME
                   FROM DBA_SOURCE
                   WHERE OWNER = 'TPHIS_MC'  --用被比較的庫代替
                       AND TYPE = 'FUNCTION') B
               ON A.NAME = B.NAME) C
WHERE C.B_NAME IS NULL
ORDER BY C.A_NAME

    --6>表中存儲或函數內容不一樣
SELECT *
FROM (SELECT A.TYPE A_TYPE,
             A.NAME A_NAME,
             A.TEXT A_TEXT,
             B.TEXT B_TEXT
      FROM (SELECT TYPE,NAME, LINE, TEXT
               FROM DBA_SOURCE
               WHERE OWNER = 'TPHIS_DEV'  --用標準庫代替
                     AND ((TYPE = 'PROCEDURE') OR (TYPE = 'FUNCTION') OR (TYPE = 'TRIGGER') OR (TYPE='PACKAGE'))) A
            LEFT JOIN
            (SELECT TYPE,NAME, LINE, TEXT
               FROM DBA_SOURCE
               WHERE OWNER = 'TPHIS_LN'  --用被比較的庫代替
                     AND ((TYPE = 'PROCEDURE') OR (TYPE = 'FUNCTION') OR (TYPE = 'TRIGGER') OR (TYPE='PACKAGE'))) B
            ON A.NAME = B.NAME  AND  length(replace(to_char(decode(A.TEXT,null,' ',A.TEXT)),' ',''))
            =length(replace(to_char(decode(B.TEXT,null,' ',B.TEXT)),' ',''))) C
WHERE C.B_TEXT IS NULL
ORDER BY C.A_NAME,C.A_TEXT;

    --7>表中缺少包
SELECT C.A_NAME, C.B_NAME
  FROM (SELECT A.NAME A_NAME, B.NAME B_NAME
          FROM (SELECT  DISTINCT NAME
                  FROM DBA_SOURCE
                 WHERE OWNER = 'TPEMR_TH'  --用標準庫代替
                       AND TYPE = 'PACKAGE') A
                LEFT JOIN
               (SELECT  DISTINCT NAME
                   FROM DBA_SOURCE
                   WHERE OWNER = 'TPEMR_ZH0621'  --用被比較的庫代替
                       AND TYPE = 'PACKAGE') B
               ON A.NAME = B.NAME) C
WHERE C.B_NAME IS NULL
ORDER BY C.A_NAME
   
--6系統函數:
    substr(bmdm,0,1)--從第一位開始截取一位
    substr(bmdm,length(bmdm),1)--從最後一位開始截取一位
--7.爲表中特定的列添加說明
    comment on column CODE_YPDM.CBBZ
is '0沒有拆包1已拆包'

--8.關於表之間缺少字段或類型不同或長度不同
SELECT C.* --DISTINCT C.A_TABLE
   FROM (SELECT  A.TABLE_NAME  AS A_TABLE,
                 A.COLUMN_NAME AS A_COL,
                 A.DATA_TYPE   AS A_TPYE,
                 A.DATA_LENGTH AS A_LEN,     
                 B.TABLE_NAME  AS B_TABLE,
                 B.COLUMN_NAME AS B_COL,
                 B.DATA_TYPE   AS B_TPYE,
                 B.DATA_LENGTH AS B_LEN                  
            FROM (SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE,DATA_LENGTH
                    FROM Dba_Tab_Columns
                    WHERE OWNER = 'TPEMR_DEV'  --用標準庫代替
                         AND TABLE_NAME = ''
                         ) A
                  LEFT JOIN
                  (SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE,DATA_LENGTH
                     FROM Dba_Tab_Columns
                     WHERE OWNER = 'TPEMR_DEV'  --用被比較的庫代替
                         AND TABLE_NAME = ''
                        ) B
                   ON A.COLUMN_NAME = B.COLUMN_NAME
                        AND A.TABLE_NAME=B.TABLE_NAME ) C
    WHERE  C.B_COL IS NULL OR (C.A_TPYE<>C.B_TPYE OR C.A_LEN <> C.B_LEN ) 
    ORDER BY C.A_TABLE,C.A_COL;
   
    --實際應用比對tpemr與tphis同名字典表
    SELECT C.* --DISTINCT C.A_TABLE
  FROM (SELECT A.TABLE_NAME  AS A_TABLE,
               A.COLUMN_NAME AS A_COL,
               A.DATA_TYPE   AS A_TPYE,
               A.DATA_LENGTH AS A_LEN,
               B.TABLE_NAME  AS B_TABLE,
               B.COLUMN_NAME AS B_COL,
               B.DATA_TYPE   AS B_TPYE,
               B.DATA_LENGTH AS B_LEN
          FROM (SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
                  FROM Dba_Tab_Columns
                 WHERE OWNER = 'TPHIS_DEV' --用標準庫代替
                   AND TABLE_NAME in
                       (select table_name
                          from dba_tables
                         where owner = 'TPEMR_DEV'
                           and table_name like '%CODE%'
                           and table_name in
                               (select table_name
                                  from dba_tables
                                 where owner = 'TPHIS_DEV'
                                   and table_name like '%CODE%'))) A
          LEFT JOIN (SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
                      FROM Dba_Tab_Columns
                     WHERE OWNER = 'TPEMR_DEV' --用被比較的庫代替
                       AND TABLE_NAME in
                           (select table_name
                              from dba_tables
                             where owner = 'TPEMR_DEV'
                               and table_name like '%CODE%'
                               and table_name in
                                   (select table_name
                                      from dba_tables
                                     where owner = 'TPHIS_DEV'
                                       and table_name like '%CODE%'))) B ON A.COLUMN_NAME =
                                                                            B.COLUMN_NAME
                                                                        AND A.TABLE_NAME =
                                                                            B.TABLE_NAME) C
WHERE C.B_COL IS NULL
    OR (C.A_TPYE <> C.B_TPYE OR C.A_LEN <> C.B_LEN)
ORDER BY C.A_TABLE, C.A_COL;
--9.關於數據庫完整性sql
--eg:code_ypdm<規格和計量單位存在對應不一致>
select 'code_ypdm' table_name,
       ypdm||'(ypdm)      '||ypmc||'(ypmc)      '||dw||'(dw)      '||jldw||'(jldw)      '||gg||'(gg)      '||jlbl||'(jlbl)      ' Error_Field,
       '在規格和劑量單位的處理上可能存在問題' Error_Explain
from (select case when substr(gg, 1, 2) = '0.'
                    then substr(gg, 2, length(to_char(jlbl)))
                  else
                    substr(gg, 1, length(to_char(jlbl)))
             end as gg0,
             to_char(jlbl) as jlbl0,length(to_char(jlbl)),
             gg,jlbl,ypdm,dw,jldw,ypmc
      from (select replace(gg,' ','') as gg,ypdm,dw,jlbl,jldw,ypmc from code_ypdm))
where gg0 <> jlbl0 and ypdm not in (select ypdm from code_ypdm where dw = jldw and jlbl = 1)
--10.修改統計報表中名稱字段長度
select 'alter table ' || table_name || ' modify ' || column_name || ' ' ||
       data_type || '(' || data_length || ');'
  from (select table_name,
               column_name,
               data_type,
               (select data_length
                from (select column_name, max(data_length) as data_length
                      from user_tab_columns
                      where table_name not like 'BIN%'
                      and column_name in
                               (select distinct column_name
                                from user_tab_columns
                                where table_name in (select table_name from user_tables where table_name like 'TJ%SHOW')
                                and column_name like '%MC')
                      group by column_name
                      order by column_name) a
                where a.column_name = b.column_name) as data_length
        from user_tab_columns b
        where table_name in (select table_name from user_tables where table_name like 'TJ%SHOW') and column_name like '%MC'
        order by table_name)
--11.解決操作員主鍵報錯問題
select * from user_source where name='TRI_CODE_KSDM_INSERT'
select * from user_source where name='TRI_CODE_KSDM_UPDATE'
insert into his_dict_dept (dept_id,dept_name,input,clinic_attr,last_modify_time,outp_or_inp,sno)
                          select ksdm,ksmc,pydm,1,xgsj,mzzy,sxh
                          from   code_ksdm
                          where  ksdm not in (select dept_id from his_dict_dept);
--12.關於job的創建
    declare job1 number;
    begin
    dbms_job.submit(job1,'PJ_CWSYQQ_SHOW2;',sysdate,'sysdate+1');
    --(參數1:job號,參數2:存儲名稱,參數3:下次執行時間,參數4:每次執行的間隔時間)
    end;
    begin
    dbms_job.remove(jobno);  --刪除
    end;
    begin
    dbms_job.next_date(job,next_date); --修改下次執行時間
    end;
    begin
    dbms_job.interval(job,interval); --修改間隔執行時間
    end;
--13.在v$session表中顯示ip信息以及觸發器的創建
    --1).trriger實現:
        create or replace trigger on_logon_trriger
        after logon on database
        begin
        dbms_application_info.set_client_info(sys_context('userenv','ip_address'));
        end;
    --2).查詢當前登錄客戶端的機器名和ip地址
        select machine,client_info from v$session where audsid=userenv('sessionid');
    --3).授權用戶實現v$session的使用(對用戶tpsoft_lp1011分配訪問v$session的權限)
        grant select on v$session to tpsoft_lp1011
    --4).創建實例:
        --函數:
        create or replace function fun_isdb_ipaddress
        return varchar2 as
            client_ipaddress varchar2(50);
        begin
            select client_info into client_ipaddress from v$session where audsid=userenv('sessionid');
        return client_ipaddress;
        end;
        --關於添加的觸發器:
        create or replace trigger tri_sis_xtcs_log_insert
        after insert on sis_xtcs
        for each row
        declare ip varchar(50);
                mc varchar(50);
        begin
            select machine into mc from v$session where audsid=userenv('sessionid');
            select client_info into ip from v$session where audsid=userenv('sessionid');
            begin
                insert into sis_xtcs_log(xtmk,csmc,xgpb,csz,mrz,bz,xgrdm,xgrmc,xglb,xgsj)
                values(:new.xtmk,:new.csmc,:new.xgpb,:new.csz,:new.mrz,:new.bz,ip,mc,'INSERT',sysdate);
            end;
        end tri_sis_xtcs_log;
        --關於刪除的觸發器:
        create or replace trigger tri_sis_xtcs_log_delete
        after delete on sis_xtcs
        for each row
        begin
            begin
            insert into sis_xtcs_log(xtmk,csmc,xgpb,csz,mrz,bz,xgrdm,xgrmc,xglb,xgsj)
                values(:old.xtmk,:old.csmc,:old.xgpb,:old.csz,:old.mrz,:old.bz,'temp','temp','DELETE',sysdate);
            end;
        end tri_sis_xtcs_log;
--14.所有表空間的使用情況
    select b.file_id 文件ID號,b.tablespace_name 表空間名,b.bytes/1024/1024||'M' 字節數,
        (b.bytes-sum(nvl(a.bytes,0)))/1024/1024||'M' 已使用,100-sum(nvl(a.bytes,0))/(b.bytes)*100 佔百分比,
        sum(nvl(a.bytes,0))/1024/1024||'M' 剩餘空間
    from dba_free_space a,dba_data_files b
    where a.file_id=b.file_id
    group by b.tablespace_name,b.file_id,b.bytes
    order by b.file_id
--15.查看用戶默認的表空間
    select a.username,a.default_tablespace from dba_users a
--3.查看要擴展的表空間使用的數據文件路徑與名字
    select * from dba_data_files where tablespace_name='TSP_TPHY'
--4.擴展表空間
    alter tablespace TSP_TPHY
    add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TPHY\TSP_TPHY1.DBF' size 500M
    autoextend on
    next 50M
    maxsize 3000M

   
   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章