ORACLE EBS 开发 用于并发程序的PL/SQL API
1. FND_CONC_GLOBAL包
这个包用于从PL/SQL程序中提交子请求。
u 函数FND_CONC_GLOBAL.REQUEST_DATA
描述:用于获取全局REQUEST_DATA的值
u 函数FND_CONC_GLOBAL.SET_REQ_GLOBALS
描述:原文描述有误,是上一个函数的描述。从后文的例子来看作用应该是设置请求的状态。
示例代码:
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;
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 可选参数,设置消息
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');
fnd_file.put_line(fnd_file.output,
'Reached point A');
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');
fnd_file.put_line(fnd_file.output,
'reached point a');
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从消息堆中获取这个消息。
并发管理器将会在日志文件中记载临时文件创建错误。
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’,用来指定是否保存输出
用来指定是否允许打印,请使用’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
--转载网络
-- 刘轶鹤