常用SQL語句收集

 

--使用connect by將拆分分割的字符串變爲行數據
select rownum,level,regexp_substr(str, '[^,]+', 1, rownum) as v, sys_connect_by_path(regexp_substr(str, '[^,]+', 1, rownum),'/') a
  from (select 'sdfsdf,sdf,dsfdsf,sadfs,jkg,43erdsvc' str from dual)
connect by ROWNUM <= length(str) - length(replace(str, ',', '')) + 1;

select substr(t, 1, instr(t, ',', 1) - 1)
  from (select substr(s, instr(s, ',', 1, rownum) + 1) || ',' as t,
               rownum as d,
               instr(s, ',', 1, rownum) + 1
          from (select ',tt,aa,bb' as s from dual)
        connect by instr(s, ',', '1', rownum) > 1);

select substr(t, 1, instr(t, ',', 1) - 1)
  from (select substr(s, instr(s, ',', 1, rownum) + 1) as t,
               rownum as d,
               instr(s, ',', 1, rownum) + 1
          from (select ',tt,aa,bb,' as s from dual)
        connect by instr(s, ',', '1', rownum) > 1)
 where t is not null;

--delete數據恢復
select timestamp_to_scn(to_timestamp('2014-12-18 09:43:20', 'yyyy-mm-dd hh24:mi:ss'))from dual;
select * from SYS_ROLE as of timestamp to_Date('2014-12-18 09:43:20', 'yyyy-mm-dd hh24:mi:ss');
--隨機產生100行數據
select level L from dual connect by level<101;

--通過dbms_flashback.get_system_change_number 可以獲得系統當前的SCN值:
select dbms_flashback.get_system_change_number scn from dual;
--通過scn_to_timestamp函數可以將SCN轉換爲時間戳:
select scn_to_timestamp(8908390522972) scn from dual;
--再通過timestamp_to_scn可以將時間戳轉換爲SCN:
select timestamp_to_scn(scn_to_timestamp(8908390522972)) scn from dual;
--通過這兩個函數,最終Oracle將SCN和時間的關係建立起來,在Oracle10g之前,是沒有辦法通過函數轉換得到SCN和時間的對應關係的,一般可以通過logmnr分析日誌獲得。但是這種轉換要依賴於數據庫內部的數據記錄,對於久遠的SCN則不能轉換,請看以下舉例:
select min(FIRST_CHANGE#) scn,max(FIRST_CHANGE#) scn from v$archived_log;

--刪除表對象
begin
  for v_c in(select object_name,object_type from user_objects where object_type in('TYPE','FUNCTION','SEQUENCE','PACKAGE','VIEW','PROCEDURE','TABLE'))loop
    begin
      execute immediate 'drop '|| v_c.object_type ||' '||v_c.object_name;
    exception
      WHEN OTHERS THEN
        dbms_output.put_line('object='||v_c.object_name||',type='||v_c.object_type||',err:'||dbms_utility.format_error_stack);
    end;
  end loop;  
end;

--
SELECT 
  --DBMS_RANDOM
  DBMS_RANDOM.RANDOM As "任意隨機數",
  ABS(MOD(DBMS_RANDOM.RANDOM,100)) as "100以內隨機數",
  dbms_random.value as "0-1隨機數",
  dbms_random.value(10,20) as "10-20隨機數",
  TRUNC(100+900*dbms_random.value) as "100-1000隨機數",
  dbms_random.normal as "正態分佈隨機數",--此正態分佈標準偏差爲1,期望值爲0。這個函數返回的數值中有68%是介於-1與+1之間,95%介於-2與+2之間,99%介於-3與+3之間
  dbms_random.string('a',20) as "隨機字符串",--[u,U]-大寫字母(默認);[l,L]-小寫字母;[a,A]-大、小寫字母;[x,X]-數字、大寫字母;[p,P]-可打印字符
  to_date(2454084+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J') as "隨機日期",
  sys_guid() as "GUID",
  --utl_raw
  utl_raw.compare('a','a') as "字符串比較",--字符串比較,0-相等,1-不相等
  --dbms_obfuscation_toolkit
  utl_raw.cast_to_raw(dbms_obfuscation_toolkit.md5(input_string => 'djk(*&*(23SJLKA')) as "加密" --要使用cast_to_raw進行轉換,否則亂碼
from dual;

--listagg 按照某列分組,合併某一列的數據
with temp as(   
  select 500 population, 'China' nation ,'Guangzhou' city from dual union all  
  select 1500 population, 'China' nation ,'Shanghai' city from dual union all  
  select 500 population, 'China' nation ,'Beijing' city from dual union all  
  select 1000 population, 'USA' nation ,'New York' city from dual union all  
  select 500 population, 'USA' nation ,'Bostom' city from dual union all  
  select 500 population, 'Japan' nation ,'Tokyo' city from dual    
)
--select * from temp;
select population,   
       nation,   
       city,   
       listagg(city,',') within GROUP (order by city) over (partition by nation) rank   
from temp;
--lag函數,可以訪問到向上特定offset偏移行的數據, ignore nulls->如果上條記錄爲空則取上上條
--lead函數,可以訪問到向下特定offset偏移行的數據, ignore nulls->如果下條記錄爲空則取下下條
with temp as(  
  select '1' month_ ,'1000' amount from dual union all  
  select '2' month_ ,'1001' amount from dual union all  
  select '3' month_ ,'' amount from dual union all  
  select '4' month_ ,'' amount from dual union all  
  select '5' month_ ,'1004' amount from dual union all  
  select '6' month_ ,'1005' amount from dual 
) 
/*select month_,amount,
  lag(amount,1) over(order by month_) as prev_amount,
  lead(amount,1) over(order by month_) as next_amount
from temp*/
select month_,amount,
 lag(amount,1)ignore nulls over (order by month_) as prev_amount,
 lead(amount,1)ignore nulls over (order by month_) as next_amount
from temp
;
SELECT DBMS_METADATA.get_ddl('PACKAGE','PKG_EXCEL_CHECK') FROM DUAL;--獲取某個對象的ddl代碼
--查詢某個對象在數據庫中是否未被引用
select * from user_objects t
where not exists(select 1 from user_source where upper(text) like '%'||t.OBJECT_NAME||'%')
  and not exists(select 1 from user_dependencies where referenced_name=t.OBJECT_NAME)
  and not exists(select 1 from user_dependencies where name=t.OBJECT_NAME)
  and object_type not in('INDEX','LOB');

--================================
select SYS_CONTEXT('USERENV', 'TERMINAL') terminal,
       SYS_CONTEXT('USERENV', 'LANGUAGE') language,
       SYS_CONTEXT('USERENV', 'SESSIONID') sessionid,
       SYS_CONTEXT('USERENV', 'INSTANCE') instance,
       SYS_CONTEXT('USERENV', 'ENTRYID') entryid,
       SYS_CONTEXT('USERENV', 'ISDBA') isdba,
       SYS_CONTEXT('USERENV', 'NLS_TERRITORY') nls_territory,
       SYS_CONTEXT('USERENV', 'NLS_CURRENCY') nls_currency,
       SYS_CONTEXT('USERENV', 'NLS_CALENDAR') nls_calendar,
       SYS_CONTEXT('USERENV', 'NLS_DATE_FORMAT') nls_date_format,
       SYS_CONTEXT('USERENV', 'NLS_DATE_LANGUAGE') nls_date_language,
       SYS_CONTEXT('USERENV', 'NLS_SORT') nls_sort,
       SYS_CONTEXT('USERENV', 'CURRENT_USER') current_user,
       SYS_CONTEXT('USERENV', 'CURRENT_USERID') current_userid,
       SYS_CONTEXT('USERENV', 'SESSION_USER') session_user,
       SYS_CONTEXT('USERENV', 'SESSION_USERID') session_userid,
       SYS_CONTEXT('USERENV', 'PROXY_USER') proxy_user,
       SYS_CONTEXT('USERENV', 'PROXY_USERID') proxy_userid,
       SYS_CONTEXT('USERENV', 'DB_DOMAIN') db_domain,
       SYS_CONTEXT('USERENV', 'DB_NAME') db_name,
       SYS_CONTEXT('USERENV', 'HOST') host,
       SYS_CONTEXT('USERENV', 'OS_USER') os_user,
       SYS_CONTEXT('USERENV', 'EXTERNAL_NAME') external_name,
       SYS_CONTEXT('USERENV', 'IP_ADDRESS') ip_address,
       SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') network_protocol,
       SYS_CONTEXT('USERENV', 'BG_JOB_ID') bg_job_id,
       SYS_CONTEXT('USERENV', 'FG_JOB_ID') fg_job_id,
       SYS_CONTEXT('USERENV', 'AUTHENTICATION_TYPE') authentication_type,
       SYS_CONTEXT('USERENV', 'AUTHENTICATION_DATA') authentication_data
      ,userenv('CLIENT_INFO')--
      --,userenv('LABLE')--
      ,userenv('ENTRYID')--
      ,userenv('sid')--
      ,userenv('isdba')--查看當前用戶是否是DBA如果是則返回true
      ,userenv('sessionid')--SESSION 返回會話標誌
      ,userenv('entryid')--ENTRYID 返回會話人口標誌
      ,userenv('instance')--INSTANCE 返回當前INSTANCE的標誌
      ,userenv('language')--LANGUAGE 返回當前環境變量
      ,userenv('lang')--LANG 返回當前環境的語言的縮寫
      ,userenv('terminal')--TERMINAL 返回用戶的終端或機器的標誌
      ,vsize(user)--VSIZE(X) 返回X的大小(字節)數
      ,user
  from dual;

--重新編譯無效對象
begin
  for v_c in (select 'ALTER ' || decode(object_type, 'PACKAGE BODY', 'PACKAGE', 'TYPE BODY', 'TYPE', object_type) || ' ' || object_name || ' COMPILE' AS txt
                from user_objects
               where status = 'INVALID') loop
    begin
      execute immediate v_c.txt;
    exception
      when others then
        dbms_output.put_line(dbms_utility.format_error_stack || '  ' || dbms_utility.format_error_backtrace);
    end;
  end loop;
end;
--查找未被引用的對象,結合代碼查找,若還找不到,則可以刪除這些對象
select * from user_objects t
where not exists(select 1 from user_source us where upper(us.TEXT) like '%'||t.object_name||'%' and not regexp_like(upper(text),'^(FUNCTION|PACKAGE|PROCEDURE|TYPE|END)\s+'||t.object_name))
  and not exists(select 1 from user_dependencies ud where ud.REFERENCED_NAME = t.OBJECT_NAME)
  and t.OBJECT_TYPE not in('LOB','PACKAGE BODY','INDEX')
;




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