我们有一个使用CL和RPG程序组合编写的存储过程。在iSeries上本地调用时,一切都很好。当从外部调用时(例如从SQL前端),RPG程序无法在它生成的假脱机文件上获得一个漏洞,因为假脱机文件出现在另一个(随机?)作业号和用户下。 作业在QUSRWRK子系统中作为QUSER运行,但假脱机文件获取在连接池外部连接的用户ID(即USERA)。
有没有办法在作业运行时能够可靠地获取正确的sppol文件句柄(而不是依赖于从该队列中选择最后一个假脱机场等)。
答案 0 :(得分:1)
如果您正在运行存储过程(在作业QZDASOINIT中运行),您将无法通过程序状态数据结构访问假脱机输出。这些假脱机文件驻留在名为user / QPRTJOB的作业中,其中user是运行存储过程的“当前用户”。要访问假脱机文件,请运行api QSPRILSP以获取指向假脱机文件的结构。
IBM的信息中心都充分记录了行为和API。
答案 1 :(得分:1)
服务器作业(例如,ODBC / JDBC的数据库服务器实例)在系统用户配置文件下运行。对于存储过程,系统用户通常是QUSER。在作业中创建的对象通常由作业用户拥有。
服务器作业通常代表其他用户执行工作。在建立连接时告诉服务器作业哪个用户。 (请注意,在其生命周期内,给定的服务器作业可能代表许多不同的用户工作。)
特别是对于假脱机输出,这是一个问题,因为假脱机子系统已经存在的时间长于我们已经拥有的" Web"在我们有大量用户连接到远程数据库之前。从用户切换到用户的行为根本不是假脱机子系统构成的一部分,IBM等供应商也不能确定假脱机文件何时应由特定作业用户或连接用户拥有。 (并且假脱机不是数据库连接的主要元素。)
IBM确实通过默认"切换用户"来调整假脱机与用户关联的输出方式。要在a job named QPRTJOB中收集的输出,但它并不完全符合您希望以后的RPG程序处理输出的方式。
但是,如果创建一个生成假脱机输出的存储过程,则proc可以选择谁拥有输出,从而选择将其保留在同一作业中。考虑这些可以粘贴到iSeries Navigator中的示例CALL'运行SQL脚本'功能:
call qsys2.qcmdexc ('OVRPRTF FILE(*PRTF) SPLFOWN(*JOB) OVRSCOPE(*JOB)' , 48);
call qsys2.qcmdexc ('DSPMSGD RANGE(CPF9899) MSGF(QCPFMSG) OUTPUT(*PRINT)' , 51);
call qsys2.qcmdexc ('DLTOVR FILE(*PRTF) LVL(*JOB)' , 28);
如果将它们作为一组运行,它们会创建假脱机输出,显示CPF9899的消息描述的属性。如果您之后检查,您应该看到QUSER现在拥有一个名为QPMSGD的假脱机文件,并且它位于处理远程数据库请求的QZDASOINIT作业中。该工作中的RPG程序可以轻松找到" * LAST"在这种情况下假脱机文件。此外,如果删除第一个和最后一个CALL,现在只运行中间的CALL,您应该会发现您拥有下一个假脱机文件。
(QUSER是IBM的默认设置。如果您的系统使用不同的用户配置文件,请将该用户替换为" QUSER&#34 ;.)
<强>建议:强>
更改SP以发出适当的OVRPRTF命令,然后在作业中捕获需要捕获的输出,并在生成输出后发出DLTOVR。
您可以使用与此处所示类似的命令来创建测试过程。尝试使用不同的OVRSCOPE()设置和FILE(* PRTF)或特定命名的文件。此外,在覆盖命令之前和之后创建输出,以查看它们的行为方式有多么不同。
请注意,SP完成后服务器作业可能会处理不同的用户(或者稍后可能会在作业中调用其他SP),因此您需要确保DLTOVR运行。 (这是使其接近OVRPRTF的一个原因。)
答案 2 :(得分:0)
我需要更多信息,但我会做出一些假设。请澄清我是否认错了。
QUSRWRK行为中的QUSER是正确的。您现在正在运行SQL服务器(或类似的服务器)。所有连接都在这些设置下运行。
有几种方法。
1)假设这一切都在一个作业中运行。使用'*'作为工作信息应该有效。
2)另一种选择是使用RTVJOBA CURUSER(&amp; ME)。当前用户是登录的用户。在这种情况下,USER不起作用。
答案 3 :(得分:0)
如果您可以修改RPG程序,则可以从Program Status Data Structure检索作业信息,而File Information Data Structure具有来自打开反馈区域的假脱机文件编号。但是,我不确定作业信息将用于QUSER作业(不是您需要的)或USERA作业(您需要什么)。假脱机文件编号可能足以用于后续Print API次呼叫。
答案 4 :(得分:0)
作业本身知道或可以找到(参见前面的答案),因此,如果所有其他方法都失败了,请修改程序,将消息放在提供所需信息的队列中。在闲暇时阅读它。
。