工具篇(Oracle) 常用指令碼

2021-09-22 18:28:50 字數 3607 閱讀 1516

目錄概述

一鍵解鎖指令碼

一鍵加索引指令碼

一鍵資料庫閃回指令碼

根據專案需求寫的一些指令碼,僅作參考,後續新指令碼會接著追加

declare

v_sqt varchar2(200);

v_errortext varchar2(200);

begin

for item in (select c.object_name,

b.username,

b.sid,

b.serial#,

logon_time

from v$locked_object a, v$session b, dba_objects c

where a.session_id = b.sid

and a.object_id = c.object_id

group by c.object_name,

b.username,

b.sid,

b.serial#,

logon_time) loop

dbms_output.put_line('鎖表使用者:' || item.username || ' 被鎖表名:' ||

item.logon_time);

v_sqt := 'alter system kill session ' || '''' || item.sid || ',' ||

item.serial# || '''';

dbms_output.put_line(v_sqt);

begin

execute immediate v_sqt;

exception

when others then

dbms_output.put_line('解鎖失敗');

v_errortext := substr(sqlerrm, 1);

dbms_output.put_line(v_errortext);

end;

end loop;

end;

declare

indx varchar2(30);

sqlt varchar(1000);

nsqlt varchar(1000);

errortext varchar2(200);

bums number := 0;

begin

dbms_output.enable(100000000);

-- 迴圈遍歷出所需要建立索引的表以及索引欄位和索引名

for item in (select c.table_name,

cc.column_name,

('atsi_' || cc.column_name) indx,

cc.position column_position

from user_constraints c, user_cons_columns cc

where c.constraint_name = cc.constraint_name

and c.constraint_type = 'r'

minus

select i.table_name,

ic.column_name,

('atsi_' || ic.column_name) indx,

ic.column_position

from user_indexes i, user_ind_columns ic

where i.index_name = ic.index_name) loop

begin

-- 如果索引過長則進行擷取

if lengthb(item.indx) > 30 then

indx := substr(item.indx, 0, 30);

else

indx := item.indx;

end if;

-- 建立索引語句

sqlt := 'create index ' || indx || ' on ' || item.table_name || '(' ||

item.column_name || ')';

-- 輸出語句指令碼,以作記錄

dbms_output.put_line(sqlt || ';');

-- 執行語句

execute immediate sqlt;

exception

when others then

dbms_output.put_line('建立索引失敗');

errortext := substr(sqlerrm, 1);

dbms_output.put_line(errortext);

dbms_output.put_line('');

-- 如果名稱已被使用則字尾加個累加標誌

if errortext = 'ora-00955: 名稱已由現有物件使用' then

nsqlt := 'create index ' || indx || bums || ' on ' ||

item.table_name || '(' || item.column_name || ')';

bums := bums + 1;

begin

dbms_output.put_line(nsqlt || '; --- new');

execute immediate nsqlt;

exception

when others then

errortext := substr(sqlerrm, 1);

dbms_output.put_line(errortext);

end;

dbms_output.put_line(nsqlt);

end if;

end;

end loop;

end;

declare

-- 要回閃的表名字

tablename varchar2(30) := 't_taskparamdef';

-- 要回閃到的時間節點(2019-05-22 10:37:00)類似這種形式

rolltime varchar2(30) := '2019-05-22 11:49:00';

sqlt varchar(1000);

begin

-- 啟動要回閃表的行移動功能

sqlt := 'alter table ' || tablename || ' enable row movement';

-- 執行語句

execute immediate sqlt;

-- 開始回閃到指定時間的表資料

sqlt := 'flashback table ' || tablename || ' to timestamp to_timestamp(' || '''' ||

rolltime || '''' || ',' || '''' || 'yyyy-mm-dd hh24:mi:ss' || '''' || ')';

-- 執行語句

execute immediate sqlt;

end;

Oracle 常用指令碼

查詢當前連線數 select count from v session select username,machine,program,status,count machine as 連線數量 from v session where username cotsdev group by userna...

oracle 常用指令碼

substr 取得字串中指定起始位置和長度的字串 instr 判斷其是否含有指定的字元 replace 替換字元 create table table 1 as select from table 2 where 1 0 建表只複製表結構 表新增預設值 alter table table 1 mod...

ORACLE 常用指令碼

ifelse declare v num number begin v num 100 if v num 100 then elsif v num 50 then else end if end 帶引數儲存過程 create or replace procedure delete subscribe...