因为工作关系,在测试一些软件或演示时,需要一段能很清楚的演示容灾和RAC的自动切换效果的代码.发现达到满意的效果还是有些技巧的. DBMS_OUTPUT并不能实时的反应出效果.而Oracle的管道反而正合用,所以后面整理了下.效果还比较满意.
效果如下:
--定义类型 CREATE OR REPLACE TYPE obj_tab_demo AS OBJECT ( id number, timesta TIMESTAMP(6) WITH TIME ZONE, inst VARCHAR2(16), insthost VARCHAR2(64) ); --实例化 CREATE OR REPLACE TYPE o_tab_demo AS TABLE OF obj_tab_demo ;小技巧:
CREATE OR REPLACE FUNCTION fun_demo(p_num NUMBER) RETURN o_tab_demo PIPELINED IS v_instname varchar2(16); v_hostname varchar2(64); v_obj obj_tab_demo; BEGIN FOR i in 1 ..p_num LOOP --实例序号 v_inst := userenv('instance'); -- 主机名 v_hostname := sys_context('userenv','host') ; -- 可以从v$instance视图中找,也可按上面的方法找出 -- SELECT instance_name,host_name into v_instname,v_hostname FROM v$instance; v_obj := obj_tab_demo(i,systimestamp,v_instname, v_hostname ); --systimestamp PIPE ROW(v_obj); END LOOP; RETURN; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||' '||SUBSTR(SQLERRM,1,200)); END;--附注:
--DEMO表结构 : create table demo ( id number, timesta TIMESTAMP(6) WITH TIME ZONE, inst VARCHAR2(16), insthost VARCHAR2(64) )3. 在PL/SQL Developer或SQLPlus中运行测试
col id for a8 col inst for a10 col timesta for a40 col insthost for a10 SELECT * FROM TABLE( fun_demo(10000) );4. 如果你认为你已达到测试目地,就可以强行中止未运行完的SELECT了.
select s.username, s.osuser, s.sid, s.serial#, p.spid, s.program, s.STATUS, 'alter system kill session '||''''||s.sid||','||s.serial#||',@1'';' as oracle_kill from v$session s,v$process p where s.paddr = p.addr and s.username is not null and s.sid = 上面查出的session id;b.然后运行 oracle_kill 杀掉会话即可.
DECLARE v_time1 TIMESTAMP(6) WITH TIME ZONE; v_time2 TIMESTAMP(6) WITH TIME ZONE; v_seconds NUMBER; v_minutes NUMBER; v_hours NUMBER; v_days NUMBER; v_weeks NUMBER; BEGIN v_time1 := '13-12月-13 10.22.31.765000 上午 +08:00'; v_time2 := '13-12月-13 10.23.04.546000 上午 +08:00'; SELECT substr((v_time2-v_time1),instr((v_time2-v_time1),' ')+7,2) seconds, substr((v_time2-v_time1),instr((v_time2-v_time1),' ')+4,2) minutes, substr((v_time2-v_time1),instr((v_time2-v_time1),' ')+1,2) hours, trunc(to_number(substr((v_time2-v_time1),1,instr(v_time2-v_time1,' ')))) days, trunc(to_number(substr((v_time2-v_time1),1,instr(v_time2-v_time1,' ')))/7) weeks INTO v_seconds,v_minutes,v_hours,v_days,v_weeks FROM dual; DBMS_OUTPUT.PUT_LINE('-------------------------------------------------'); DBMS_OUTPUT.PUT_LINE('begin: '||v_time1); DBMS_OUTPUT.PUT_LINE('end : '||v_time2); DBMS_OUTPUT.PUT_LINE('-------------------------------------------------'); DBMS_OUTPUT.PUT_LINE('seconds : '||v_seconds); DBMS_OUTPUT.PUT_LINE('minutes : '||v_minutes); DBMS_OUTPUT.PUT_LINE('hours : '||v_hours); DBMS_OUTPUT.PUT_LINE('days : '||v_days); DBMS_OUTPUT.PUT_LINE('weeks : '||v_weeks); DBMS_OUTPUT.PUT_LINE('-------------------------------------------------'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||' '||SUBSTR(SQLERRM,1,200)); END; /
至此,应当就能得到想要的效果了。
MAIL:[email protected]
Blog:http://blog.csdn.net/xcl168