随笔 - 571  文章 - 4  评论 - 253  阅读 - 72万

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

posted on   东方瀚海  阅读(1487)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

点击右上角即可分享
微信分享提示