《Oracle Applications DBA 基础》- 9 - Concurrent Processing ================================== 参考资料: 1. Oracle Applications System Administrator's Guide - Configuration http://download.oracle.com/docs/ ... acrobat/120sacg.pdf 2. Oracle Applications System Administrator's Guide - Maintenance http://download.oracle.com/docs/ ... acrobat/120samg.pdf 3. Oracle 11i System Administrator Fundamentals 4. Oracle Applications Developer's Guide http://download.oracle.com/docs/ ... acrobat/120devg.pdf 并发处理 ( Concurrent process) 和 并发管理器(Concurrent Manager) 是R12中负责 处理批作业 或 后台作业的。 用的地方很多,所以需要多花点时间理解。 Concurrent Manager 管理的基础知识,比如 start/stop,output and logfile location 等, 前面已提及。 下面只是列出一些常用的内容,可以帮助理解concurrent manager。 ===================================================== # 如何从 concurrent request id 找到 Oracle session id (sid) : 很多时候我们需要从 concurrent request 的request id 找到对应的 Oracle session id (sid),可以用下面的方法, 由此我们也可了解 concurrent manager 对应的 table 结构。 # 当前正在运行的 concurrent request: select request_id, controlling_manager, phase_code from fnd_concurrent_requests where phase_code='R'; # 根据 request id 找到 对应的<controlling_manager> select request_id, controlling_manager, phase_code from fnd_concurrent_requests where request_id = <request_id>; # 根据 <controlling_manager> 找到对应的<ORACLE_PROCESS_ID>: select OS_PROCESS_ID, ORACLE_PROCESS_ID from fnd_concurrent_processes where CONCURRENT_PROCESS_ID = <controlling_manager>; # 根据 <ORACLE_PROCESS_ID> 就知道 SID select a.sid ,b.spid from v$session a , v$process b where b.addr=a.paddr and b.pid = <ORACLE_PROCESS_ID>; # 另外一种 SQL query 方法: select session_id from fnd_concurrent_processes where CONCURRENT_PROCESS_ID = <controlling_manager>; select sid from v$session where audsid=<session_id>; =========================================== # 统计 每个 program 对应完成的 request 数量: select a.concurrent_program_id , b.CONCURRENT_PROGRAM_NAME, count(1) from fnd_concurrent_requests a, fnd_concurrent_programs b where a.concurrent_program_id = b.concurrent_program_id group by a.concurrent_program_id,b.CONCURRENT_PROGRAM_NAME; =============================================== # 列出 concurrent program的种类 col LOOKUP_CODE for a10 col meaning for a60 select lv.lookup_code, lv.meaning from fnd_lookup_values lv where lv.lookup_type='CP_EXECUTION_METHOD_CODE' and language='US' order by 1; # 列出 concurrent program的种类对应的数量 select lv.meaning , count(*) from fnd_lookup_values lv, fnd_concurrent_programs cp where lv.lookup_type='CP_EXECUTION_METHOD_CODE' and language='US' and lv.lookup_code=cp.execution_method_code group by lv.meaning order by 2; select cp.enabled_flag,lv.meaning , count(*) cp_count from fnd_lookup_values lv,fnd_concurrent_programs cp where lv.lookup_type='CP_EXECUTION_METHOD_CODE' and language='US' and lv.lookup_code=cp.execution_method_code group by cp.enabled_flag,lv.meaning order by cp.enabled_flag, cp_count; ========================================================== # 列出正在运行的 concurrent manager processes: select CONCURRENT_QUEUE_NAME, control_code, running_processes, max_processes from fnd_concurrent_queues where running_processes != 0 ======================== # status code 对应的解释 <297909.1> select lookup_type,lookup_code, meaning from fnd_lookups where lookup_type like 'CP_%'; # fnd_concurrent_processes 的 status_code select lookup_code, meaning from fnd_lookups where lookup_type='CP_PROCESS_STATUS_CODE' # 如何手动停掉正在运行的 Concurrent Request <154688.1> update fnd_concurrent_requests set status_code='C',phase_code='c' where request_id=4374195; # <152763.1> , in that case, set status_code='X' # check the meaning of status_code of requests from the note above update fnd_concurrent_requests set status_code='C' ,phase_code='C' where request_id = 2722233; # The Oracle server process might become runaway. # find out the sid first to kill it manully if needed. ================================== # 如何在命令行上提交 concurrent request CONCSUB apps/apps SYSADMIN "System Administrator" SYSADMIN WAIT=N CONCURRENT FND cusupt3 PROGRAM_NAME="custom update 3" "cusupt3": concurrent executable in $FND_TOP/bin # 如何 trace concurrent program =================================== metalink note: 453527.1 1. concurrent program => define => "Enable Trace" 2. Profiles => System => Concurrent:Allow Debugging 3. submit request => Debug Options # 各种 不同的 concurrent programs Concurrent Program 可以用不同的方式构成, 既可以用 shell,PL/SQL, C, JAVA 等 语言,也可以用 Oracle Reports,SQL*loader 等工具。下面逐一介绍。 ====================================== example 1 : shell concurrent program ======================================= cd $FND_TOP/bin vi WH1TEST.prog cat ./WH1TEST.prog =========================== #!/bin/ksh . /applvis/apps/apps_st/appl/APPSVIS_mis.env sqlplus apps/apps@VIS <<EOF EOF echo "END" ========================= chmod +x WH1TEST.prog ### pass parameter as separate variable ln -s $FND_TOP/bin/fndcpesr WH1TEST 然后,在R12中逐一定义如下内容: concurrent executable concurrent program Responsibility : Request request group (system Administrator Reports) ## start concurrent program "WH1TEST" manually CONCSUB apps/apps SYSADMIN "System Administrator" SYSADMIN WAIT=N CONCURRENT FND WH1TEST PROGRAM_NAME="WH1TEST" select CONCURRENT_PROGRAM_NAME, PROGRAM_TYPE from fnd_concurrent_programs where concurrent_program_name likE '%WH1%'; ==================================================================== example 2: c & pro*c concurrent program ======================================== 基本上参考 metalink <113428.1>。因为内容比较长,不在这里列出。 example 3: report concurrent program =================================== 这里只是copy 现成的一个test Oracle Report 做示范。 cd $FND_TOP/reports/US Note: the report file should be in US directory. cp /applvis/apps/tech_st/10.1.2/reports/samples/demo/test.rdf ./WH1RPTCP.rdf [applvis@mis US]$ pwd /applvis/apps/apps_st/appl/fnd/12.0.0/reports/US [applvis@mis US]$ ls -l WH1* -rw-r--r-- 1 applvis dba 98304 Aug 9 17:40 WH1RPTCP.rdf [applvis@mis US]$ then register this rdf as in other cases of the concurrent testing program use "WH1RPTCP" as the Execution file name. (note: without the .rdf suffix) but in the "define" part, choose "pdf" as output format . ================================================= example 4: PL/SQL concurrent program =================================== 参考 metalink <73492.1>。 [oravis@mis ~]$ cat plconc.sql create or replace procedure WH1plcp(errbuf out varchar2, retcode out varchar2) as begin fnd_file.put_line(FND_FILE.LOG, 'WH1plcp begins'); fnd_file.put_line(FND_FILE.OUTPUT, 'WH1plcp output'); insert into t1 values('WH1PLCP'); commit; fnd_file.put_line(FND_FILE.LOG, 'WH1plcp ends'); end; / [oravis@mis ~]$ ### submit conc request in PL/SQL ### ref <221542.1> ### note that CONC_REQUEST_ID returns -1. <878636.1> declare v_id number; v_id2 number; begin --(user_id, responsibility_id, app_resp_id) --(sysadmin, system administrator, application system admin) fnd_global.apps_initialize(0,20420,1); --(app short name, conc program short name ) v_id := APPS.FND_REQUEST.SUBMIT_REQUEST('FND','FNDSCURS'); v_id2 := FND_GLOBAL.CONC_REQUEST_ID; commit; dbms_output.put_line(v_id); dbms_output.put_line(v_id2); end; / ### find out relevant info select * from fnd_application_tl where application_id = 1 ; select * from fnd_user where user_name ='SYSADMIN' ; select * from fnd_responsibility_tl where responsibility_name = 'System Administrator'; select * from fnd_user_resp_groups where user_id = 0 ; select * from fnd_conc_req_summary_v where program_short_name='FNDSCURS'; select * from fnd_conc_req_summary_v where request_id= 314020 ; ### check the stauts of an conc request declare l_req_id number; l_phase varchar2(30); l_status varchar2(30); l_dev_status varchar2(30); l_dev_phase varchar2(30); l_msg varchar2(2000); status boolean; begin l_req_id := 314021 ; status :=fnd_concurrent.get_request_status(REQUEST_ID=>l_req_id, PHASE=> l_phase, STATUS=>l_status, DEV_PHASE => l_dev_phase, DEV_STATUS => l_dev_status, MESSAGE => l_msg ) ; dbms_output.put_line(l_req_id ||':'||l_phase||':'||l_status||':'||l_dev_phase||':'||l_dev_status); end; / ##################################### example 5: SQL*loader Concurrent program ======================================== vi .ctl file in $PRODUCT_TOP/bin example 6: Java concurrent program ================================================= 参看 metalink <250964.1>。 cd $JAVA_TOP/oracle/apps/fnd/cp mkdir sample vi Hello.java ################################ package oracle.apps.fnd.cp.sample; import oracle.apps.fnd.cp.request.*; public class Hello implements JavaConcurrentProgram { public static final String RCS_ID = "$Header$"; public void runProgram (CpContext ctx) { ctx.getLogFile().writeln("-- Hello World!--",0); ctx.getOutFile().writeln("-- Hello World!--"); ctx.getReqCompletion().setCompletion(ReqCompletion.NORMAL, ""); } } ########################### javac $JAVA_TOP/oracle/apps/fnd/cp/sample/Hello.java ls -l $INST_TOP/appl/fnd/12.0.0/secure/VIS.dbc [applvis@mis sample]$ which java /applvis/apps/tech_st/10.1.3/appsutil/jdk/jre/bin/java java -Ddbcfile=$INST_TOP/appl/fnd/12.0.0/secure/VIS.dbc -Drequest.outfile=./outfile oracle.apps.fnd.cp.request.Run oracle.apps.fnd.cp.sample.Hello # 在R12中作如下设置: executable: WH1JAVACP program:WH1JAVACP security > responsiblity > request ### 另一个版本 cat Hello.java package oracle.apps.fnd.cp.sample; import oracle.apps.fnd.cp.request.*; import oracle.apps.fnd.util.*; import java.io.*; import java.sql.*; public class Hello implements JavaConcurrentProgram { public static final String RCS_ID = "$Header$"; String c1Var ; public void runProgram (CpContext ctx) { c1Var ="HI"; ctx.getLogFile().writeln("-- Hello World!--",0); ctx.getOutFile().writeln("-- Hello World!--"); Connection mJConn = ctx.getJDBCConnection(); ParameterList lPara = ctx.getParameterList(); ReqCompletion lRC = ctx.getReqCompletion(); String lQuery = "select c1 from t1 where c1 = ?"; while (lPara.hasMoreElements() ) { NameValueType aNVT = lPara.nextParameter(); c1Var = aNVT.getValue(); } try { PreparedStatement lStmt = mJConn.prepareStatement(lQuery); lStmt.setString(1, c1Var); ResultSet lRs = lStmt.executeQuery(); OutFile lOF = ctx.getOutFile(); LogFile lLF = ctx.getLogFile(); while ( lRs.next() ) { lOF.writeln(lRs.getString(1)); } lStmt.close(); ctx.getReqCompletion().setCompletion(ReqCompletion.NORMAL, ""); } catch (SQLException e) { lRC.setCompletion(ReqCompletion.ERROR,e.toString()); } finally { ctx.releaseJDBCConnection(); } } } java -Ddbcfile=$INST_TOP/appl/fnd/12.0.0/secure/VIS.dbc -Drequest.outfile=./outfile oracle.apps.fnd.cp.request.Run oracle.apps.fnd.cp.sample.Hello "TOKEN1=HI" ======================================================================= |