]]>[转]什么是savepointQ?/title>http://www.aygfsteel.com/wangbing/archive/2010/03/05/314557.htmlwangchangbingwangchangbingFri, 05 Mar 2010 01:06:00 GMThttp://www.aygfsteel.com/wangbing/archive/2010/03/05/314557.htmlhttp://www.aygfsteel.com/wangbing/comments/314557.htmlhttp://www.aygfsteel.com/wangbing/archive/2010/03/05/314557.html#Feedback0http://www.aygfsteel.com/wangbing/comments/commentRss/314557.htmlhttp://www.aygfsteel.com/wangbing/services/trackbacks/314557.html什么是savepoint?
Use the SAVEPOINT statement to identify a point in a transaction to which you can later roll back.
例如Q?nbsp;
SQL> SELECT * FROM SCOTT.DEPT ;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> UPDATE SCOTT.DEPT SET loc ='a' WHERE loc='NEW YORK';
1 row updated
SQL> SAVEPOINT a;
Savepoint created
SQL> UPDATE SCOTT.DEPT SET loc ='b' WHERE loc='DALLAS';
1 row updated
SQL> SAVEPOINT b;
Savepoint created
SQL> ROLLBACK TO SAVEPOINT a;
Rollback complete
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM SCOTT.DEPT ;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING a
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
注意Q?br />
1.savepoint 名字保持唯一
2.如果后面新设|的一个savepoint的名字和前面的一个savepoint名字重复Q前一个savepoint被取消
3.讄savepoint后,事务可以l箋commit,全部回退或者回退到具体一个savepoints
(Savepoint names must be distinct within a given transaction. If you create a second savepoint with the same identifier as an earlier savepoint, then the earlier savepoint is erased. After a savepoint has been created, you can either continue processing, commit your work, roll back the entire transaction, or roll back to the savepoint.)
4.撤销的处理必L在没有发出commit命o的前提下才能有效?br />
如下Q在commit;后执行rollback to savepointp|
SQL> SELECT * FROM SCOTT.DEPT ;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> UPDATE SCOTT.DEPT SET loc ='a' WHERE loc='NEW YORK';
1 row updated
SQL> SAVEPOINT a;
Savepoint created
SQL> UPDATE SCOTT.DEPT SET loc ='b' WHERE loc='DALLAS';
1 row updated
SQL> SAVEPOINT b;
Savepoint created
SQL> COMMIT;
Commit complete
SQL> ROLLBACK TO SAVEPOINT a;
ROLLBACK TO SAVEPOINT a
ORA-01086: 从未创徏保留?'A'
SQL> SELECT * FROM SCOTT.DEPT ;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING a
20 RESEARCH b
30 SALES CHICAGO
40 OPERATIONS BOSTON
]]>oracle常用的监控语?/title>http://www.aygfsteel.com/wangbing/archive/2010/02/03/311821.htmlwangchangbingwangchangbingWed, 03 Feb 2010 09:09:00 GMThttp://www.aygfsteel.com/wangbing/archive/2010/02/03/311821.htmlhttp://www.aygfsteel.com/wangbing/comments/311821.htmlhttp://www.aygfsteel.com/wangbing/archive/2010/02/03/311821.html#Feedback0http://www.aygfsteel.com/wangbing/comments/commentRss/311821.htmlhttp://www.aygfsteel.com/wangbing/services/trackbacks/311821.html--ҎFILE_ID & BLOCK_ID获得对象名称
SELECT /*+ RULE*/ owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = &file_id
AND &block_id BETWEEN block_id AND block_id + blocks - 1;
--Ҏ操作pȝPID,查询SESSION信息
SELECT a.sid, a.serial#, b.spid, a.terminal, a.machine, a.program, a.osuser
FROM v$session a, v$process b
WHERE a.paddr = b.addr AND b.spid = '&SPID';
--ҎSESSION SID,查询操作pȝPID
SELECT a.sid, a.serial#, b.spid, a.terminal, a.machine, a.program, a.osuser
FROM v$session a, v$process b
WHERE a.paddr = b.addr AND a.sid = '&SID';
--查询用户正在执行的SQL
SELECT sql_text
FROM v$sqltext
WHERE hash_value = (SELECT sql_hash_value
FROM v$session
WHERE sid = &sid)
ORDER BY piece;
--查询当前的系l等待事?br />
SELECT *
FROM v$session_wait
WHERE event NOT LIKE '%SQL*Net%'
AND event NOT LIKE '%rdbms%'
AND event NOT LIKE '%timer%'
AND event NOT LIKE '%jobq%'
ORDER BY event, seconds_in_wait;
--查询详细的当前系l等待事?br />
SELECT s.sid, s.username, w.seq#, w.event, w.p1text, w.p1, w.p2text, w.p2, w.p3text, w.p3,
w.seconds_in_wait, w.state, s.logon_time, s.osuser, s.program
FROM v$session s, v$session_wait w
WHERE s.sid = w.sid
AND w.event NOT LIKE '%SQL*Net%'
AND w.event NOT LIKE '%rdbms%'
AND w.event NOT LIKE '%timer%'
AND w.event NOT LIKE '%jobq%'
ORDER BY w.event, w.seconds_in_wait;
--查询{待db file sequential/scattered read的Session正在执行的SQL
SELECT s.sid, s.username, t.hash_value, t.piece, t.sql_text
FROM v$session s, v$session_wait w, v$sqltext t
WHERE s.sid = w.sid
AND s.sql_hash_value = t.hash_value
AND w.event IN ('db file sequential read', 'db file scattered read')
ORDER BY s.sid, t.piece;
--查询{待db file sequential/scattered read对应的数据库对象
SELECT /*+ RULE*/ s.sid, s.username, w.seq#, w.event,
d.segment_type, d.owner || '.' || d.segment_name AS segment_name,
w.seconds_in_wait, w.state, s.logon_time
FROM v$session s, v$session_wait w, dba_extents d
WHERE s.sid = w.sid
AND d.file_id = w.p1
AND w.p2 BETWEEN d.block_id AND d.block_id + d.blocks - 1
AND w.event IN ('db file sequential read', 'db file scattered read')
ORDER BY w.event, segment_name;
--查询DLOCK的SID,SPID,LOCKED_OBJECT,LOCK_TYPE{信?br />
SELECT /*+ RULE*/
l.sid, p.spid, s.username,s.logon_time, s.osuser, s.program, l.type,
CASE l.TYPE WHEN 'TM' THEN O.object_name WHEN 'TX' THEN '' END as OBJECT_NAME,
DECODE (l.lmode, 0, '0=NONE', 1, '1=NULL', 2, '2=RS', 3, '3=RX', 4, '4=S', 5, '5=SRX', 6, '6=X') lmode,
CASE l.request WHEN 0 THEN '' ELSE 'BLOCKED BY ' || l.id2 END as BLOCKED,
CASE l.block WHEN 0 THEN '' ELSE l.id2 || ' IS BLOCKING' END as BLOCKING,
l.request, l.ctime
FROM v$lock l, v$session s, dba_objects o, v$process p
WHERE l.type in ('TX', 'TM')
AND s.paddr = p.addr
AND l.sid = s.sid
AND l.id1 = o.object_id(+)
ORDER BY s.username, l.sid, l.ctime;
--查询DDDL LOCK的详l信?br />
SELECT s.sid, p.spid, s.username, a.owner || '.' || a.NAME AS OBJECT_NAME,
a.TYPE, a.mode_held, a.mode_requested, s.osuser, s.logon_time, s.program
FROM dba_ddl_locks a, v$session s, v$process p
WHERE s.sid = a.session_id
AND s.paddr = p.addr
AND (a.mode_held = 'Exclusive' OR a.mode_requested = 'Exclusive')
ORDER BY s.USERNAME, a.NAME;
--查询事务使用的回滚段
SELECT s.username, s.sid, s.serial#, t.ubafil "UBA filenum",
t.ubablk "UBA Block number", t.used_ublk "Number of undo Blocks Used",
t.start_time, t.status, t.start_scnb, t.xidusn rollid, r.name rollname
FROM v$session s, v$transaction t, v$rollname r
WHERE s.saddr = t.ses_addr AND t.xidusn = r.usn;
####################################################################################################
--查询LIBRARY CACHE PIN{待事g{待的对?br />
--视图~写:[K]ernel [G]eneric [L]ibrary Cache Manager [OB]ject
SELECT /*+ RULE*/ addr, kglhdadr, kglhdpar, kglnaobj, kglnahsh, kglhdobj
FROM x$kglob
WHERE kglhdadr IN (SELECT p1raw
FROM v$session_wait
WHERE event LIKE '%library%');
--查询LIBRARY CACHE PIN{待事g中持有被{待对象的SESSION信息
--视图~写:[K]ernel [G]eneric [L]ibrary Cache Manager Object [P]i[N]s
SELECT /*+ RULE*/ a.SID, a.username, a.program, b.addr, b.kglpnadr, b.kglpnuse,
b.kglpnses, b.kglpnhdl, b.kglpnlck, b.kglpnmod, b.kglpnreq
FROM v$session a, x$kglpn b
WHERE a.saddr = b.kglpnuse
AND b.kglpnmod <> 0
AND b.kglpnhdl IN (SELECT p1raw
FROM v$session_wait
WHERE event LIKE '%library%');
--查询LIBRARY CACHE PIN{待事g中持有被{待对象的SESSION执行的SQL语句
SELECT sql_text
FROM v$sqlarea
WHERE (v$sqlarea.address, v$sqlarea.hash_value) IN (
SELECT sql_address, sql_hash_value
FROM v$session
WHERE SID IN (
SELECT /*+ RULE*/ SID
FROM v$session a, x$kglpn b
WHERE a.saddr = b.kglpnuse
AND b.kglpnmod <> 0
AND b.kglpnhdl IN (SELECT p1raw
FROM v$session_wait
WHERE event LIKE '%library%')));
--查询哪个SESSION正在使用某个对象(LIBRARY CACHE)
SELECT DISTINCT s.sid,
s.username,
s.logon_time,
s.osuser,
s.program,
b.kglnahsh as SQL_HASH_VALUE,
b.kglnaobj as SQL_TEXT
FROM v$session s, x$kglpn n, x$kglob b
WHERE n.kglpnuse = s.saddr
AND upper(b.kglnaobj) LIKE upper('%&OBJECT_NAME%')
AND n.kglpnhdl = b.kglhdadr;
--查询V$SESSION_WAIT用户PIN住了哪些对象(LIBRARY CACHE)
SELECT DISTINCT s.sid,
s.username,
s.logon_time,
s.osuser,
s.program,
n.kglpnmod,
b.kglnahsh AS SQL_HASH_VALUE,
b.kglnaobj AS SQL_TEXT
FROM v$session s, x$kglpn n, x$kglob b
WHERE n.kglpnuse = s.saddr
AND n.kglpnhdl = b.kglhdadr
AND s.sid IN (SELECT sid
FROM v$session_wait
WHERE event NOT LIKE '%SQL*Net%'
AND event NOT LIKE '%rdbms%'
AND event NOT LIKE '%timer%'
AND event NOT LIKE '%jobq%')
ORDER BY s.username;
--查询哪些大对象被载入SHARED POOL时导致其它对象被老化
SELECT s.sid, s.username, s.logon_time, s.osuser, s.program,
k.ksmlrcom, k.ksmlrsiz, k.ksmlrnum, k.ksmlrhon, k.ksmlrses
FROM x$ksmlru k, v$session s
WHERE s.saddr = k.ksmlrses
AND ksmlrsiz > 0;
####################################################################################################
--查询Schema哪些表是全表扫描
SELECT o.name, x.tch
FROM obj$ o, x$bh x, dba_users u
WHERE x.obj = o.dataobj#
AND STANDARD.bitand(x.flag, 524288) > 0
AND u.username = UPPER('&username')
ORDER BY x.tch DESC;
--查询低效率的SQL(BUFFER_GETS排序)
SELECT *
FROM (SELECT s.sid,
b.spid,
s.sql_hash_value,
q.sql_text,
q.executions,
q.buffer_gets,
ROUND(q.buffer_gets / q.executions) AS buffer_per_exec,
ROUND(q.elapsed_time / q.executions) AS cpu_time_per_exec,
q.cpu_time,
q.elapsed_time,
q.disk_reads,
q.rows_processed
FROM v$session s, v$process b, v$sql q
WHERE s.sql_hash_value = q.hash_value
AND s.paddr = b.addr
AND s.status = 'ACTIVE'
AND s.TYPE = 'USER'
AND q.buffer_gets > 0
AND q.executions > 0
ORDER BY buffer_per_exec DESC)
WHERE ROWNUM <= 10;
####################################################################################################
--监控BufferCache命中?br />
SELECT a.value + b.value logical_reads, c.value phys_reads,
ROUND (100 * (1 - c.value / (a.value + b.value)), 4) hit_ratio
FROM v$sysstat a, v$sysstat b, v$sysstat c
WHERE a.NAME = 'db block gets'
AND b.NAME = 'consistent gets'
AND c.NAME = 'physical reads';
--监控LibraryCache命中?br />
SELECT SUM (pins) total_pins, SUM (reloads) total_reloads,
SUM (reloads) / SUM (pins) * 100 libcache_reload_ratio
FROM v$librarycache;
--查询产生的跟t文件名
SELECT p1.VALUE || '/' || p2.VALUE || '_ora_' || p.spid || '.trc' filename
FROM v$process p, v$session s, v$parameter p1, v$parameter p2
WHERE p1.NAME = 'user_dump_dest'
AND p2.NAME = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID');
--删除表中的重复记?br />
DELETE FROM table_name a
WHERE ROWID >
(SELECT MIN (ROWID)
FROM table_name b
WHERE b.pk_column_1 = a.pk_column_1
AND b.pk_column_2 = a.pk_column_2);
]]>存储q程事务控制http://www.aygfsteel.com/wangbing/archive/2010/01/26/310894.htmlwangchangbingwangchangbingTue, 26 Jan 2010 10:58:00 GMThttp://www.aygfsteel.com/wangbing/archive/2010/01/26/310894.htmlhttp://www.aygfsteel.com/wangbing/comments/310894.htmlhttp://www.aygfsteel.com/wangbing/archive/2010/01/26/310894.html#Feedback0http://www.aygfsteel.com/wangbing/comments/commentRss/310894.htmlhttp://www.aygfsteel.com/wangbing/services/trackbacks/310894.html存储q程里的事务操作Q?br />
create or replace procedure pr_mypro2(p_a in varchar2,p_b in varchar2,p_count out number)
temp varchar2(1000); /**//*定义临时变量*/
is
begin
select code into p_count from table1 where a=p_a; /**//*查询q返回?/
temp := p_count; /**//*返回Dl时变?/
savepoint point1; /**//*保存?/
insert into table2(a,b)values(temp,p_b); /**//*时变量值添加到新表的字D?/
savepoint point2;
insert into
exception
when others then
rollback to savepoint point1; /**//*异常处理Q保存点下面的操作都不会被执?/
return;
end;
保存?br />
(SAVEPOINT)是事务处理过E中的一个标志,与回滚命?ROLLBACK)l合使用Q主要的用途是允许用户某一D处理回滚而不必回滚整个事务?br />
如果定义了多个savepointQ当指定回滚到某个savepointӞ那么回滚操作回滚这个savepoint后面的所有操作(即后面可能标记了N个savepointQ?br />
例如Q在一D处理中定义了五个savepointQ从W三个savepoint回滚Q后面的W四、第五个标记的操作都被回滚Q如果不使用ROLLBACK TO savepoint_name而用ROLLBACKQ将会滚整个事务处理?/span>
对于讄ODI的定时执行场景,需要启动Scheduler AgentQ在一个新的ODI安装完毕之后Q默认的odiparams.bat文g中设|的是连接DEMO环境的数据库q接配置Q如果我们在自己的数据库里创ZMaster Repository和Work RepositoryQ那么需要修改连接参数?br />
在我的测试环境中Q我使用的是自己机器上Oracle 11g数据库,实例名是orcl11gQ则需要做如下修改Q?br />
set ODI_SECU_DRIVER=oracle.jdbc.driver.OracleDriver
set ODI_SECU_URL=jdbc:oracle:thin:@localhost:1521:orcl11g
set ODI_SECU_USER=snpm
set ODI_SECU_ENCODED_PASS=b9yX4CpBkdmaP8Y3mYbaoye2p
set ODI_SECU_WORK_REP=WORKREP1
set ODI_USER=SUPERVISOR
set ODI_ENCODED_PASS=hZypfAZQf.Yo8VWVI6HZzc
其中Q?br />
ODI_SECU_USER需要设|ؓ创徏Master Repository时候的用户名,在这里是snpm?br />
ODI_SECU_ENCODED_PASS需要用agent实用E序加密一下,用法是agent encode %PASSWORD%?br />
ODI_SECU_WORK_REP讄为创建Work Repository时候v的名字?br />
ODI_USER默认是SUPERVISORQ这是连接ODI的用户名?br />
ODI_ENCODED_PASS默认是SUNOPSISQ也需要用agent encode加密之后的倹{?br />
讄完毕Q启动Scheduler AgentQ会遇到下面的错误:
java.lang.Exception: Agent is not declared in Topology Manager
我们q需要在Topology Manager -> Physical Architecture -> Agents里面创徏一个AgentQ填写Agent的名字,监听的机器,端口。如果需要设|ScheduleQ还需要在Topology Manager -> Logical Architecture -> Agents里面再创Z个AgentQ将刚才创徏的Physical Agent和此Logical Agentl定在一赗?br />
然后Q在Designer -> Projects -> Scenarios -> Scheduling中创Z个执行计划,之后再次启动Scheduler AgentOK了?br />
C:\OraODI\oracledi\bin>agentscheduler “-port=20910″ “-NAME=myFirstAgent”
A JDK is required to execute Web Services with OracleDI. You are currently using a JRE.
OracleDI: Starting Scheduler Agent …
Starting Oracle Data Integrator Agent…
Version : 10.1.3.4.0 – 30/10/2007
Agent in scheduling mode
Number of items for scheduled executions:0 08/17/200802:58:09 PM(main): Server Launched
Aug 17, 20083:06:27 PM com.sunopsis.j.s a
INFO: Start Thread[1001@2008/08/17_03:06:27:000,5,main] @ Aug 17, 20083:06:27 PM
]]>oracle包,动态执行sql—?TESTFUNINPROChttp://www.aygfsteel.com/wangbing/archive/2009/05/21/271970.htmlwangchangbingwangchangbingThu, 21 May 2009 06:37:00 GMThttp://www.aygfsteel.com/wangbing/archive/2009/05/21/271970.htmlhttp://www.aygfsteel.com/wangbing/comments/271970.htmlhttp://www.aygfsteel.com/wangbing/archive/2009/05/21/271970.html#Feedback0http://www.aygfsteel.com/wangbing/comments/commentRss/271970.htmlhttp://www.aygfsteel.com/wangbing/services/trackbacks/271970.htmldrop package TESTFUNINPROC /
/*==============================================================*/ /* Database package: TESTFUNINPROC */ /*==============================================================*/ createorreplace package TESTFUNINPROC as
type OUTLIST is REF CURSOR; function TESTFUN (TYPENUM INvarchar2) return outlist; procedure TESTPROC (TYPENUM INvarchar2,RESULT OUT outlist); end TESTFUNINPROC; /
createorreplace package body TESTFUNINPROC as function TESTFUN (TYPENUM INvarchar2) return outlist as
rc outlist; Begin open rc for select* from GG_BOOK book where book.BOOK_ZBLX = typeNum ; return rc; End; procedure TESTPROC (TYPENUM INvarchar2,RESULT OUT outlist) as Begin
result := hblz_new.TestFunInProc.testFun(typeNum); End; end TESTFUNINPROC; /
]]>ODI的一Ҏ?/title>http://www.aygfsteel.com/wangbing/archive/2009/05/21/271964.htmlwangchangbingwangchangbingThu, 21 May 2009 06:25:00 GMThttp://www.aygfsteel.com/wangbing/archive/2009/05/21/271964.htmlhttp://www.aygfsteel.com/wangbing/comments/271964.htmlhttp://www.aygfsteel.com/wangbing/archive/2009/05/21/271964.html#Feedback0http://www.aygfsteel.com/wangbing/comments/commentRss/271964.htmlhttp://www.aygfsteel.com/wangbing/services/trackbacks/271964.html Hi,
I have two tables with same structure. Now I want to union the data from these two table and load the result in target table. How can I achieve this functionality in ODI? In formatica this can be done using UNION Transformation but I don't know about ODI.
Please help.
Thanks,
Monika
Hi Monika,
Union transformation cannot be done by Interface in ODI.
There are three option in ODI to achieve your task
1) you need to create two interfaces like int1 and int2
where int1 will transfer the data from tab1(source) to target table and int2 will transfer the tab2(source) to target table.
2) In second option, create a view for the union of tab1 and tab2 and use that view as source in the interafce to tranfer the union data to target. In this method we can achive this by single interface.
3) create the ODI procedure with a sql query of insert into target_table (select * from tab1 union select * from tab2).