ORACLE EBS 开发 用于并发程序的PL/SQL API(转)

--译者:罗勇,对原文有删减、补充、纠正,不提供翻译质量保证。

18用于并发程序的PL/SQL API

18.1 FND_CONC_GLOBAL包

这个包用于从PL/SQL程序中提交子请求。

u 函数FND_CONC_GLOBAL.REQUEST_DATA

描述:用于获取全局REQUEST_DATA的值

u 函数FND_CONC_GLOBAL.SET_REQ_GLOBALS

描述:原文描述有误,是上一个函数的描述。从后文的例子来看作用应该是设置请求的状态。

示例代码:

/*
* This is sample PL/SQL concurrent program submits 10
* sub¨Crequests. The sub¨Crequests are submitted one at a
* time. Each time a sub¨Crequest is submitted, the parent
* exits to the Running/Paused state, so that it does not
* consume any resources while waiting for the child
* request, to complete. When the child completes the
* parent is restarted.
*/
CREATE OR REPLACE PROCEDURE PARENT(errbuf OUT VARCHAR2,
retcode OUT NUMBER) IS
i NUMBER;
req_data VARCHAR2(10);
r NUMBER;
BEGIN
--Read the value from REQUEST_DATA. If this is the first run of the program, then this value will be null.
-- Otherwise, this will be the value that we passed to SET_REQ_GLOBALS on the previous run.
req_data := fnd_conc_global.request_data;
--If this is the first run, we'll set i = 1. Otherwise, we'll set i = request_data + 1, and we'll exit if we're done.
IF (req_data IS NOT NULL) THEN
i := to_number(req_data);
i := i + 1;
IF (i < 11) THEN
errbuf := 'done ! ';
retcode := 0;
RETURN;
END IF;
ELSE
i := 1;
END IF;
--Submit the child request. The sub_request parameter must be set to 'Y'.
r := fnd_request.submit_request('fnd',
'child',
'child ' || to_char(i),
NULL,
TRUE,
fnd_conc_global.printer);
IF r = 0 THEN
--If request submission failed, exit with error.
errbuf := fnd_MESSage.get;
retcode := 2;
ELSE
--Here we set the globals to put the program into the
--PAUSED status on exit, and to save the state in request_data.
fnd_conc_global.set_req_globals(conc_status => 'paused',
request_data => to_char(i));
errbuf := 'sub¨Crequest submitted ! ';
retcode := 0;
END IF;
RETURN;
END;

18.2 FND_CONCURRENT包

u FND_CONCURRENT.AF_COMMIT

当并发程序使用某个特殊的回滚段时用来commit,这个特殊的回滚段应该在定义并发程序表单定义。该函数没有参数。

u FND_CONCURRENT.AF_ROLLBACK

当并发程序使用某个特殊的回滚段时用来rollback,这个特殊的回滚段应该在定义并发程序表单定义。该函数没有参数。

u FND_CONCURRENT.GET_REQUEST_STATUS(客户端服务器端都有的函数)

语法形式:

FUNCTION fnd_concurrent.get_request_status(request_id IN OUT NUMBER,
application IN VARCHAR2 DEFAULT NULL,
program IN VARCHAR2 DEFAULT NULL,
phase OUT VARCHAR2,
status OUT VARCHAR2,
dev_phase OUT VARCHAR2,
dev_status OUT VARCHAR2,
message OUT VARCHAR2) RETURN BOOLEAN;

描述:返回并发程序的状态,如果并发程序完成了,也返回其完成消息。它既可以返回用户友好的并发程序阶段和状态,也可以返回程序运行状态,用来驱动程序逻辑。

输入参数说明:

u request_id 要检查的并发程序的ID;

u application 与并发程序相关联的应用产品的简称,该参数只有在没有传入request_id时才是必须的;

u program 并发程序的简称,不是可执行的简称。该参数只有在没有传入request_id时才是必须的。当提供了application和program参数时,那么该程序的最后一个并发请求id将作为request_id传入。

输出参数说明:

u phase 用户友好的并发请求阶段,可以从FND_LOOKUPS查到所有的阶段名

u status 用户友好的并发请求状态可以从FND_LOOKUPS查到所有的状态名

u dev_phase 一个常量字符串,可以用来进行程序逻辑比较

u dev_status 一个常量字符串,可以用来进行程序逻辑比较

u message 如果并发程序已经完成了,返回的完成消息

使用示例:

罗勇补注:原文示例有误,我修正测时候如下:

DECLARE
call_status BOOLEAN;
rphase VARCHAR2(80);
rstatus VARCHAR2(80);
dphase VARCHAR2(30);
dstatus VARCHAR2(30);
message VARCHAR2(240);
request_id NUMBER;
BEGIN
request_id := 3045472;
call_status := fnd_concurrent.get_request_status(request_id,
'',
'',
rphase,
rstatus,
dphase,
dstatus,
message);
IF call_status THEN
dbms_output.put_line(rphase || '|' || rstatus || '|' || message);
END IF;
END;

对于正常完成的oracle report并发请求会返回 已完成|正常|正常完成

对于有警告完成的oracle report请求会返回 已完成|警告|正常完成

对于程序状态本文就不翻译了,不过其返回的不是中文是英文,可能返回值可参考英文版第 591和592页,完全正常运行则dphase 值是COMPLETE,dstatus 值是NORMAL。

u FND_CONCURRENT.WAIT_FOR_REQUEST(客户端服务器端都有的函数)

语法:

FUNCTION fnd_concurrent.wait_for_request(request_id IN NUMBER DEFAULT NULL,
INTERVAL IN NUMBER DEFAULT 60,
max_wait IN NUMBER DEFAULT 0,
phase OUT VARCHAR2,
status OUT VARCHAR2,
dev_phase OUT VARCHAR2,
dev_status OUT VARCHAR2,
message OUT VARCHAR2) RETURN BOOLEAN;

说明:等待并发请求的完成,然后返回请求的阶段、状态以及完成消息。在等待的过程中每隔一段时间检查一下。

输入参数说明:

request_id: 并发请求的id

interval: 两次检查见等待的秒数,两次检查之间该程序会休息

max_wait: 等待并发请求完成所能等待的的最长时间,单位为秒。

输出参数同前一个函数,恕罗勇不重复翻译啦。

原文没有示例用法,罗勇补充个:

DECLARE
call_status BOOLEAN;
rphase VARCHAR2(80);
rstatus VARCHAR2(80);
dphase VARCHAR2(30);
dstatus VARCHAR2(30);
message VARCHAR2(240);
request_id NUMBER;
BEGIN
request_id := 3046222;
call_status := fnd_concurrent.wait_for_request(request_id,
10,
1000,
rphase,
rstatus,
dphase,
dstatus,
message);
IF call_status THEN
dbms_output.put_line(rphase || '|' || rstatus || '|' || message);
END IF;
END;

程序会等在此处直到并发请求完成或者满了1000秒。

u FND_CONCURRENT.SET_COMPLETION_STATUS (服务器端函数)

语法:

FUNCTION fnd_concurrent.set_completion_status(status IN VARCHAR2,
message IN VARCHAR2) RETURN BOOLEAN;

说明:在并发程序内调用用来设置并发程序的状态及消息。如果设置成功则返回TURE,否则返回FALSE。

输入参数说明:

status 要设置的并发程序的状态,为NORMAL, WARNING, 或者 ERROR

message 可选参数,设置消息

18.3 FND_FILE:PL/SQL FILE I/O

fnd_file包包括了过程用来写日志和输出文件。处于测试和调试用户,你可以使用FND_FILE.PUT_NAMES和FND_FILE.CLOSE这两个过程,但是记住不要在并发程序中调用这两个过程。fnd_file支持的最大缓冲行大小是32K。请注意,该包并不是用来做PL/SQL文本I/O的,而是用来写日志和输出文件的。

u FND_FILE.PUT

语法:

PROCEDURE fnd_file.put(which IN NUMBER,
buff IN VARCHAR2);

描述:向文件写文本,文本后不会跟上换行符,多次调用该过程缩写的问题是连在一起的,所以它经常和FND_FILE.NEW_LINE一起使用。

输入参数说明:

which 日志文件或者输出文件,使用FND_FILE.LOG或者FND_FILE.OUTPUT。

buff 要写入的文本。

罗勇提醒您特别注意:在较低版本的report builder中,如果你将which指定为FND_FILE.LOG或者FND_FILE.OUTPUT 将会产生编译错误,此时用数字替换,若是写日志就用1作为which的值即可。

u FND_FILE.PUT_LINE

语法:

PROCEDURE fnd_file.put_line(which IN NUMBER,
buff IN VARCHAR2);

描述:也是用来向文件写文本,不过文本后会跟上换行符。这可能是你最常用的。

参数说明同上一个函数,恕我不重复翻译啦。

示例:使用消息字典来获取已经产生与服务器的消息,然后将其放到日志文件中,这样允许将消息存入日志文件时自动进行语言转换,比如:

FND_FILE.PUT_LINE( FND_FILE.LOG, fnd_message.get );

当然也可以直接将硬编码的文本写入日志文件,但是推荐,因为是硬编码的,存入时不会进行转换,比如:

fnd_file.put_line(FND_FILE.LOG,'Warning: Employee '|| l_log_employee_name||' ('|| l_log_employee_num || ') does not have a manager.');

u FND_FILE.NEW_LINE

语法:

PROCEDURE fnd_file.new_line(which IN NUMBER,
lines IN NATURAL := 1);

描述:用来向文件写入换行符

输入参数说明:

which 日志文件或者输出文件,使用FND_FILE.LOG或者FND_FILE.OUTPUT。

lines 写入换行符的数量,默认为1

示例:

向文本写入两个换行符:

fnd_file.new_line(FND_FILE.LOG,2);

u FND_FILE.PUT_NAMES

语法:

PROCEDURE fnd_file.put_names(p_log IN VARCHAR2,
p_out IN VARCHAR2,
p_dir IN VARCHAR2);

描述:用来设置用户指定的临时日志文件和输出文件以及临时目录。DIR目录应该是一个数据库能写的目录。该过程应该在调用任何其他FND_FILE过程前调用,而且每个会话只能调用一次。注意:指示用来从SQL*PLUS中测试和调试,不能在并发程序内部调用。

输入参数说明:

p_log 临时日志文件名

p_out 临时输出文件名

p_dir 临时目录名

示例如下:

BEGIN
fnd_file.put_names('test.log',
'test.out',
'/local/db/8.0.4/db¨Ctemp¨Cdir/');
fnd_file.put_line(fnd_file.output,
'Called stored procedure');
/* Some logic here... */
fnd_file.put_line(fnd_file.output,
'Reached point A');
/* More logic, etc... */
fnd_file.CLOSE;
END;

u FND_FILE.CLOSE

语法示例:

FND_FILE.CLOSE;

注意,不能在并发程序中调用,只能用于命令行会话中。

示例:

BEGIN
fnd_file.put_names('test.log',
'test.out',
' / LOCAL / db / 8.0.4 / db¨Ctemp¨Cdir / ');
fnd_file.put_line(fnd_file.output,
'called stored procedure');
/* Some logic here... */
fnd_file.put_line(fnd_file.output,
'reached point a');
/* More logic, etc... */
fnd_file.CLOSE;
END;

u 错误处理

对于EBS 11i来讲,FND_FILE包可引发一个异常,那就是FND_FILE.UTL_FILE_ERROR异常,说明遇到了一个UTL_FILE错误。具体来说,过程FND_FILE.PUT,FND_FILE.PUT_LINE和FND_FILE.NEW_LINE如果遇到了错误就会发引发FND_FILE.UTL_FILE_ERROR异常。除了这个异常以外,FND_FILE还可能引发一些预定义的PL/SQL异常,比如NO_DATA_FOUND或者VALUE_ERROR异常。

FND_FILE如果无法打开临时文件或者无法向临时文件写入文字的话就会引发FND_FILE.UTL_FILE_ERROR异常。产生这个异常以后,到底是并发程序出错还是正常完成这取决于并发程序。FND_FILE在引发FND_FILE.UTL_FILE_ERROR异常前会将翻译后的消息放在消息堆(message stack)中。程序员可获取这个FND_FILE错误的消息,并将其作为请求完成的消息。调用者可以在异常处理中通过调用FND_MESSAGE从消息堆中获取这个消息。

并发管理器将会在日志文件中记载临时文件创建错误。

18.4 FND_PROGRAM并发程序加载器

FND_PROGRAM包包括一些过程用来创建并发程序可执行,并发程序(可包括参数和不兼容规则),请求集和请求组。当然啦,该包还提供了函数用来检测并发程序、可执行、参数、不兼容规则是否存在。

根据oracle应用程序对象库表单的字段来输入的话,一般不会出现异常。罗勇补注:此处是指使用ebs提供的并发程序相关界面来操作的话一般不会出现什么异常。如果发生错误就会引发ORA–06501: PL/SQL: internal error is raised. 异常。这个异常信息可以通过调用函数fnd_program.message() 来获取。这个包不会捕获一些错误,典型的比如” duplicate value on index”。罗勇补注:这个错误是发生在向唯一索引中插入重复键值时。请注意,如果违反了外键约束会引发异常,比如,delete_program() 过程如果删除一个并不存在的并发程序并不会出错,如果提供了错误的应用产品名称就会出错。

u FND_PROGRAM.MESSAGE

概要: 函数FND_PROGRAM.MESSAGE返回VARCHAR2类型

描述:用来返回错误消息。当任何验证错误出现时就会设置消息。

u FND_PROGRAM.EXECUTABLE

概要:

PROCEDURE fnd_program.executable(executable IN VARCHAR2,
application IN VARCHAR2,
description IN VARCHAR2 DEFAULT NULL,
execution_method IN VARCHAR2,
execution_file_name IN VARCHAR2 DEFAULT NULL,
subroutine_name IN VARCHAR2 DEFAULT NULL,
icon_name IN VARCHAR2 DEFAULT NULL,
language_code IN VARCHAR2 DEFAULT 'us');

描述:使用该过程来定义一个并发程序可执行。这个过程对应的是通过系统管理员或者应用开发员职责访问的并发程序>可执行菜单对应的表单。

输入参数说明:

executable

可执行名称,比如’FNDSCRMT’

application

可执行所属的应用产品的简称,比如’FND’

description

可选的可执行描述

execution_method

可执行使用的程序类型,可能的值包括'Host', 'Immediate', 'Oracle Reports','PL/SQL Stored Procedure', 'Spawned','SQL*Loader', 'SQL*Plus'

execution_file_name

可执行的操作系统文件名。处理立即式并发程序外都是必须的,除了是PL/SQL存储过程外,该名称不允许包括空格和句点。

subroutine_name

子程序名称,仅用域立即式并发请求,不能包括空格和句点。

icon_name

请传入空值NULL,是为未来内部程序开发而保留的。

language_code

名称和说明的语言代码,比如’US’

罗勇补注:查看该过程的源码可以知道还有一个参数execution_file_path 也就是可执行文件的路径,默认值为NULL。

u FND_PROGRAM.DELETE_EXECUTABLE

概要:

PROCEDURE fnd_program.delete_executable(executable IN VARCHAR2,
application IN VARCHAR2);

描述:用来删除并发程序可执行。如果要被删除的可执行已经分配给了某个并发程序,那么将不能删除。

输入参数说明:

executable

可执行名称

application

可执行所属的应用产品的简称,比如’FND’

u FND_PROGRAM.REGISTER

概要:

PROCEDURE fnd_program.register(program IN VARCHAR2,
application IN VARCHAR2,
enabled IN VARCHAR2,
short_name IN VARCHAR2,
description IN VARCHAR2 DEFAULT NULL,
executable_name IN VARCHAR2,
executable_application IN VARCHAR2,
execution_options IN VARCHAR2 DEFAULT NULL,
priority IN NUMBER DEFAULT NULL,
save_output IN VARCHAR2 DEFAULT 'y',
print IN VARCHAR2 DEFAULT 'y',
cols IN NUMBER DEFAULT NULL,
rows IN NUMBER DEFAULT NULL,
style. IN VARCHAR2 DEFAULT NULL,
style_required IN VARCHAR2 DEFAULT 'n',
printer IN VARCHAR2 DEFAULT NULL,
request_type IN VARCHAR2 DEFAULT NULL,
request_type_application IN VARCHAR2 DEFAULT NULL,
use_in_srs IN VARCHAR2 DEFAULT 'n',
allow_disabled_values IN VARCHAR2 DEFAULT 'n',
run_alone IN VARCHAR2 DEFAULT 'n',
output_type IN VARCHAR2 DEFAULT 'text',
enable_trace IN VARCHAR2 DEFAULT 'n',
restart IN VARCHAR2 DEFAULT 'y',
nls_compliant IN VARCHAR2 DEFAULT 'n',
icon_name IN VARCHAR2 DEFAULT NULL,
language_code IN VARCHAR2 DEFAULT 'us' mls_function_short_name IN VARCHAR2,
mls_function_application IN VARCHAR2,
incrementor IN VARCHAR2);

描述:

用来定义并发程序。该过程对应系统管理员和应用开发员职责的并发>程序 菜单。

输入参数说明:

program

用户可以看到的并发程序的名称,比如’菜单报表’

application

拥有该并发程序的应用产品的简称。该参数决定了该程序使用的oracle用户名

enabled

请使用’Y’或者’N’

short_name

简称,也就是程序开发人员使用的程序名称

description

可选的并发程序描述

executable_name

已经注册的并发程序可执行的简称

executable_application

可执行所属的应用产品的简称

execution_options

可选的特别的字符串,用于某种特定的可执行方法比如oracle report

priority

可选的并发程序优先级

save_output

请使用’Y’或者’N’,用来指定是否保存输出

print

用来指定是否允许打印,请使用’Y’或者’N’

cols

报表列的页宽

rows

报表行的页长

style

默认的打印样式名称

style_required

指示在请求提交窗口是否允许更改默认的打印样式

printer

将并发程序输出内容输出到的打印机

request_type

用户自定义的请求类型

request_type_application

拥有该请求类型的应用产品简称

use_in_srs

指示是否可由用户在标准请求提交窗口提交该并发请求,请使用’Y’或者’N’

all_disabled_values

指示是否可用过时的值集来验证参数,请使用’Y’或者’N’

run_alone

指示是否单独运行,请使用’Y’或者’N’

output_type

并发程序产生的输出类型,从’HTML’,’PS’,’TEXT’或者’PDF’中选择

enable_trace

指示是否一直启用SQL 追踪,请使用’Y’或者’N’

nls_compliant

请使用’N’,该参数是保留待将来使用

icon_name

请使用NULL,该参数是保留待将来使用

language_code

程序名称和说明所使用的语言代码

mls_function_short_name

注册的MLS功能名称

mls_function_application

MLS功能所属的应用产品的简称

incrementor

PL/SQL功能名的增量。罗勇补注:该参数似乎没用

u FND_PROGRAM.DELETE_PROGRAM

概要:

PROCEDURE fnd_program.delete_program(program_short_name IN VARCHAR2,
application IN VARCHAR2);

描述:用来删除并发程序,对该并发程序的所有引用也将删除。

输入参数描述,同上相同参数名称的参数描述,略。

u FND_PROGRAM.PARAMETER

概要:

PROCEDURE fnd_program.parameter(program_short_name IN VARCHAR2,
application IN VARCHAR2,
sequence IN NUMBER,
parameter IN VARCHAR2,
description IN VARCHAR2 DEFAULT NULL,
enabled IN VARCHAR2 DEFAULT 'y',
value_set IN VARCHAR2,
default_type IN VARCHAR2 DEFAULT NULL,
default_value IN VARCHAR2 DEFAULT NULL,
required IN VARCHAR2 DEFAULT 'n',
enable_security IN VARCHAR2 DEFAULT 'n',
RANGE IN VARCHAR2 DEFAULT NULL,
display IN VARCHAR2 DEFAULT 'y',
display_size IN NUMBER,
description_size IN NUMBER,
concatenated_description_size IN NUMBER,
prompt IN VARCHAR2 DEFAULT NULL,
token IN VARCHAR2 DEFAULT NULL);

输入参数描述:略。后面的也略,因为查看数据库中该包可以看到相关内容,而且数据库中包更加准确,而且界面提供了相关功能。

u FND_PROGRAM.DELETE_PARAMETER

u FND_PROGRAM.INCOMPATIBILITY

u FND_PROGRAM.DELETE_INCOMPATIBILITY

u FND_PROGRAM.REQUEST_GROUP

u FND_PROGRAM.DELETE_GROUP

u FND_PROGRAM.ADD_TO_GROUP

u FND_PROGRAM.REMOVE_FROM_GROUP

u FND_PROGRAM.PROGRAM_EXISTS

u FND_PROGRAM.PARAMETER_EXISTS

u FND_PROGRAM.INCOMPATIBILITY_EXISTS

u FND_PROGRAM.EXECUTABLE_EXISTS

u FND_PROGRAM.REQUEST_GROUP_EXISTS

u FND_PROGRAM.PROGRAM_IN_GROUP

FND_PROGRAM.ENABLE_PROGRAM

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24627116/viewspace-754546/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24627116/viewspace-754546/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值