Shell_Oracle Erp基于主机文件Host开发详解(案例)
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
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建