oracle SQL葵花寶典(續寫中)

 
查詢某列重複的數據
select * from Flyz_People where People_Name in (select   People_Name from   Flyz_People group by   People_Name having count (People_Name) > 1)
刪除用戶下面的所有表結構:
 
select   'Drop   table   '||table_name||';'     
        from   all_tables   
        where   owner='SF_UNITE';  
 
2011-07-12: 修改多表結構中相同字段的字段
 
 
 
 
CREATE OR REPLACE procedure ABLEMMS.update_table
   is
   v_length NUMBER;
   sqls varchar2(4000);
     table_name varchar2(4000);
    b varchar2(4000);
      c varchar2(4000);
     d int;
   
   cursor cur is select u.table_name, t.DATA_TYPE,t.COLUMN_NAME, t.DATA_LENGTH from user_tables u, user_tab_columns t where 
       u.table_name = t.TABLE_NAME  and t.TABLE_NAME = 'QF_KEYWORDS';
   begin
       open cur;
       LOOP
     FETCH cur INTO table_name,b,c,d;
  EXIT WHEN cur%NOTFOUND;
           if b = 'VARCHAR2' THEN
                   v_length := d+10;             
                  sqls :='alter table ' || table_name ||' modify ' || c || ' VARCHAR2('||v_length||')';
                   EXECUTE IMMEDIATE  sqls; 
           END IF;    
       END LOOP;
    close cur;
    
end update_table;
 
2011-04-25: 刪除用戶下所有的表結構
create or replace
PROCEDURE "del_table" 
  IS
cursor cur1 is select table_name from user_tables;
begin
  for cur2 in cur1 loop
    execute immediate 'drop table '||cur2.table_name||'cascade constraints';
  end loop;
end;
2011-04-14:oracle查詢被鎖死的表以及解鎖
 
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
 
查詢SID在執行的sql:
select sql_text from v$session a,v$sqltext_with_newlines b
  where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
  and a.sid in (&sid,&serial) order by piece;
 
 

alter system kill session '&sid,&SERIAL';
 
 
 
 
 
2011-03-25:oralce分頁查詢SQL語句
select * from ABLEPHOTO where rowid in(select rid from (select rownum rn,rid from(select rowid rid,ATIME from 
ABLEPHOTO order by ATIME desc) where rownum<50) where rn>30) order by ATIME desc 
 
ATIME 是表ABLEPHOTO 中的字段也是根據這個字段排序的
1、去掉重複記錄 保留一條
DELETE FROM A_TEST 
WHERE UNAME IN (  SELECT UNAME 
                      FROM A_TEST 
                     GROUP BY UNAME 
                    HAVING COUNT(UNAME) > 1    ) 
   AND ROWID NOT IN ( SELECT MIN(ROWID) 
                       FROM A_TEST 
                      GROUP BY UNAME 
                     HAVING COUNT(UNAME) > 1   )
 
 2、替換字段根據指定的字符
update QF_KEYWORDS set KEYWORD=REPLACE(KEYWORD, ',' , '')
 
3、oracle job時間
 
 
 
 
每天運行一次 'SYSDATE + 1'
每小時運行一次 'SYSDATE + 1/24'
每10分鐘運行一次 'SYSDATE + 10/(60*24)'
每30秒運行一次 'SYSDATE + 30/(60*24*60)'
每隔一星期運行一次 'SYSDATE + 7'
 
 
每天午夜12點 'TRUNC(SYSDATE + 1)'
每天早上8點30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12點 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每個月第一天的午夜12點 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每個季度最後一天的晚上11點 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6點10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
 
每天凌晨0點執行
TRUNC(sysdate+1)
每天凌晨1點執行
TRUNC(sysdate+1)+1/24
每天早上8點30分執行
TRUNC(SYSDATE+1)+(8*60+30)/(24*60)
 
3、每週定時執行
例如:
每週一凌晨2點執行
TRUNC(next_day(sysdate,1))+2/24
TRUNC(next_day(sysdate,'星期一'))+2/24
每週二中午12點執行
TRUNC(next_day(sysdate,2))+12/24
TRUNC(next_day(sysdate,'星期二'))+12/24
 
4、每月定時執行
例如:
每月1日凌晨0點執行
TRUNC(LAST_DAY(SYSDATE)+1)
每月1日凌晨1點執行
TRUNC(LAST_DAY(SYSDATE)+1)+1/24
 
5、每季度定時執行
每季度的第一天凌晨0點執行
TRUNC(ADD_MONTHS(SYSDATE,3),'q')
每季度的第一天凌晨2點執行
TRUNC(ADD_MONTHS(SYSDATE,3),'q')+2/24
每季度的最後一天的晚上11點執行
TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24
 
6、每半年定時執行
例如:
每年7月1日和1月1日凌晨1點執行
ADD_MONTHS(TRUNC(sysdate,'yyyy'),6)+1/24
 
7、每年定時執行
例如:
每年1月1日凌晨2點執行
ADD_MONTHS(TRUNC(sysdate,'yyyy'),12)+2/24
根據規律來算,其實就非常簡單了。 
 
8、每月的第一天跟最後一天
oracle 獲取 每月第一天 最後一天

博客分類: oracle
Oracle 
方法一: 
    select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天",to_char(last_day(sysdate), 'yyyy-mm-dd') "本月最後一天" from dual; 

方法二: 
    select trunc(sysdate, 'MONTH') 本月第一天,to_date(to_char(last_day(sysdate),'YYYY-MM-DD'),'YYYY-MM-DD') 本月最後一天 from dual; 

方法三: 
    select trunc(sysdate, 'MONTH') 本月第一天,to_char(last_day(sysdate), 'YYYY-MM-DD') 本月最後一天 from dual;
4、oracle查詢表名:
 
select table_name from all_tables t where table_name like '%SEND%'
當庫中的表中太多太多的時候,可以查詢所有庫中的表名
 select table_name from user_tables
查詢用戶下面的表
 
 
 
5、創建索引:
CREATE INDEX "IPIQXT"."TZHS10_SUBMIT" ON "IPIQXT"."TZHS10_SUBMIT"
  (
    "ID"
  )
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS STORAGE
  (
    INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
  )
  TABLESPACE "MBOP" ;
 
6、創建job:
 
--兩種方法 三十分鐘執行一次存儲過程DAYBAKDATA
 
1、VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno, 'DAYBAKDATA;', sysdate , 'SYSDATE+30/1440');
   commit;
END;
 
2、DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => X
   ,what      => 'DAYBAKDATA;'
   ,next_date => SYSDATE+30/1440
   ,interval  => 'SYSDATE+30/1440'
   ,no_parse  => FALSE
  );
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
7、打印
 
dbms_output.put_line('歸檔了一條彩信發送狀態');
 
8、創建索引:
CREATE INDEX "MY_SUBMIT4" ON "MY_SUBMIT4"
  (
    "ID"
  )
 
 
10、創建觸發器
create or replace
TRIGGER bjcbsend
   AFTER INSERT ON a_SUBMIT
   FOR EACH ROW
DECLARE
BEGIN
 
 
   --sql操作 以上是插入數據時候的觸發器 以下注釋的是如果你想要修改某個字段的時候的觸發器 只需把INSERT改成UPDATE  然後加上以下代碼
   --  if updating('字段') and :NEW.字段> '100'  then
   --       執行sql操作
   -- end if;
   --END;
 
9、創建序列
CREATE SEQUENCE "IPIQXT"."SEQ_ABLEPHOTO"
MINVALUE 1 MAXVALUE 9999999999999999999999999999
INCREMENT BY 1 START WITH 20000 CACHE 20 NOORDER NOCYCLE ;
 
 10、創建函數
--從表T_a 中取出phone 條件是AREANO =傳入的參數areano1
create or replace
function vphone (areano1 in varchar2)
return varchar2 
is
  phone1 varchar2(20);
  begin
      select phone into phone1 from T_a where rownum=1 and AREANO = areano1 and flag 
   return(phone1);
end ; 

 

發佈了30 篇原創文章 · 獲贊 3 · 訪問量 1757
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章