2014-06-20 Created By BaoXinjian
一、摘要
Oracle 并发程式中Host Type的可执行程式,它的作用是用于调用Unix Shell去执行某些需求
个人觉得Oracle EBS中引入Host去调用unix shell其弥补了很多PLSQL类型程式无法做的某些功能,以unix shell的语法结构直接对服务器进行操作
写host并发程式时,需要较强的Bash语法知识,个人不做DBA,只了解一部分,所以就不具体介绍了,只说明一下Oracle EBS开发Unix Shell时需要注意的地方
1. Host并发程式中必须定义的4个系统参数,自定义参数可以从第5个开始引用
ORA_USER_PASS=$1
ORA_USER_ID=$2
ORA_LOGIN_NAME=$3
ORA_REQUEST_ID=$4
2 Prog文件放置时必须注意读写权限,最好是777,避免无法应用
3 并发程式设定好之后,注意通过fndcpesr建立虚拟连接
ln -s $FND_TOP/bin/fndcpesr $FND_TOP/bin/bxjhosts
4. 文件后缀名不是.sh, 而是.prog
5. 当Shell调用需返回Waring或者Log信息给并发程式管理器时,可通过API<fnd_concurrent><fnd_file.log/output>
fnd_global.INITIALIZE(l_session_id, null, null, null,null, -1, null, null, null, null, $4, null,null,null,null,null,null,-1);
l_result := fnd_concurrent.set_completion_status(‘WARNING’,'Review log file for details.’);
二、案例分析
案例: 创建一个Host并发程式,自定义2个参数,将Host自带的4个系统参数和2个自定义参数在host程式运行后,自动存放至记录表中
1. 创建一个测试表,用以存放Host并发程式传入的参数
create table bxj_hosts_test(
ora_user_pass varchar2(50), ->必须定义的系统参数用户及密码
ora_user_id varchar2(50), ->必须定义的系统参数用户ID
ora_login_name varchar2(50), ->必须定义的系统参数用户名
ora_request_id varchar2(50), ->必须定义的系统Request_ID
invoice_id varchar2(50), ->自定义参数
invoice_number varchar2(240),->自定义参数
creation_date date
);
2. 建立一个后缀名为prog的Unix Shell文件,采用Bash语法,其构成为4部分
2.1 定义从并发管理器传入的4个默认系统参数和2个自定义参数
2.2 准备SQL文件用以之后调用,并产生$ORACLE_PATH/bxjhosts.sql
2.3 通过SQLPLUS执行第二步产生的SQL文件
2.4 根据SQLPLUS中的DBMSOUT,产生LOG文件
1 #/bin/bash
2 # +--------------------------------------------+
3 # + An example of calling host concurrent +
4 # + Author: Gavin.Bao +
5 # +--------------------------------------------+
6 #
7 # ---------------------------------
8 # Define variable
9 # ---------------------------------
10
11 export ORA_USER_PASS=$1
12 export ORA_USER_ID=$2
13 export ORA_LOGIN_NAME=$3
14 export ORA_REQUEST_ID=$4
15
16 export INVOICE_ID=$5
17 export INVOICE_NUMBER=$6
18
19 export ORACLE_PATH="/home/applvis/bts"
20
21 # ---------------------------------
22 # Prepare plsql script
23 # ---------------------------------
24
25 echo "set serveroutput on size 1000000" > $ORACLE_PATH/bxjhosts.sql
26 echo "set feed off" >> $ORACLE_PATH/bxjhosts.sql
27 echo "begin" >> $ORACLE_PATH/bxjhosts.sql
28 echo " insert into bxj_hosts_test " >> $ORACLE_PATH/bxjhosts.sql
29 echo " values ('$ORA_USER_PASS','$ORA_USER_ID','$ORA_LOGIN_NAME', '$ORA_REQUEST_ID', '$INVOICE_ID', '$INVOICE_NUMBER', SYSDATE);" >>$ORACLE_PATH/bxjhosts.sql
30 echo " commit;" >>$ORACLE_PATH/bxjhosts.sql
31 echo " dbms_output.put_line('Excuted Sucessfully.');" >> $ORACLE_PATH/bxjhosts.sql
32 echo "exception when others then" >> $ORACLE_PATH/bxjhosts.sql
33 echo " rollback;" >> $ORACLE_PATH/bxjhosts.sql
34 echo " dbms_output.put_line('Executed Failed');" >> $ORACLE_PATH/bxjhosts.sql
35 echo " dbms_output.put_line('SQLCODE='||SQLCODE);" >> $ORACLE_PATH/bxjhosts.sql
36 echo " dbms_output.put_line('SQLERRM='||SQLERRM);" >> $ORACLE_PATH/bxjhosts.sql
37 echo "end;" >> $ORACLE_PATH/bxjhosts.sql
38 echo "/" >> $ORACLE_PATH/bxjhosts.sql
39
40 # --------------------------------
41 # Execute plsql script
42 # --------------------------------
43
44 if [ -s $ORACLE_PATH/bxjhosts.sql ]; then
45 echo -e "Running SQL script to find out bdump directory... \n"
46 $ORACLE_HOME/bin/sqlplus -s apps/apps > $ORACLE_PATH/bxjhosts.log << EOF
47 @$ORACLE_PATH/bxjhosts.sql
48 EOF
49 fi
50
51 # --------------------------------
52 # Execute generate log file
53 # --------------------------------
54 echo "Check the reslut "
55 echo "------------------------"
56 cat $ORACLE_PATH/bxjhosts.log
57
58 echo "bxjhosts.sh excuted end"
3. 在application定义Excutable 和 Concurrent Program之前,在Unix环境下测试Prog文件,确保该文件没有问题,不存在语法错误
4. 配置Prog文件读写权限和使用fndcpesr建立bxjhosts.prog的虚拟连接
4.1设定权限: chmod 777 bxjhosts.prog
4.2建立虚拟连接: ln -s $FND_TOP/bin/fndcpesr $FND_TOP/bin/bxjhosts
5. 语法没有任何问题,定义Excutable和Concurrent Program
Unix Shell中前4个参数,系统会默认赋值,从5个参数开始,才真正从并发程式的定义中取值
三、案例测试
Test1. 调用该程式
Test2. 在执行Host并发程式中,因为在Prog中定义了两个文件产生方式如下
Test2.1 SQL文件用以最终Prog Shell最终执行哪段SQL
Test2.2 LOG文件用以最终Prog Shell执行过程中的Log语法
Test3. 将Host Prog中的Insert语句执行结果如下,4个系统参数,2个用户自定义参数
四、 案例中遇到的问题
Issue1 调用程式时提示无法找到该host文件,无法被执行,原因在于prog文件的权限问题和虚拟连接是否建立
Thanks and Regards
ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建