当从客户端调用时,DB2外部存储过程与CPF9810一起失败

当从客户端调用时,DB2外部存储过程与CPF9810一起失败,db2,ibm-midrange,db2-400,Db2,Ibm Midrange,Db2 400,在绿屏会话中,当我的库列表设置为QGPL、QTEMP、VENDRLIB1、VENDRLIB2、VENDRLIB3时,校准程序MYLIB/TESTPRG就会起作用。我可以在绿色屏幕命令行上执行调用MYLIB/TESTPRG 我希望能够从Windows客户端运行此命令。我创建了一个外部存储过程MYLIB/TESTPROC,外部名称为MYLIB/TESTPRG,正如我在各种文章中看到的那样。我最初的问题是,我可以在绿色屏幕会话中使用我的库列表在STRSQL中成功地执行这个过程,如上所述,但这是错误的。

在绿屏会话中,当我的库列表设置为QGPL、QTEMP、VENDRLIB1、VENDRLIB2、VENDRLIB3时,校准程序MYLIB/TESTPRG就会起作用。我可以在绿色屏幕命令行上执行
调用MYLIB/TESTPRG


我希望能够从Windows客户端运行此命令。我创建了一个外部存储过程MYLIB/TESTPROC,外部名称为MYLIB/TESTPRG,正如我在各种文章中看到的那样。我最初的问题是,我可以在绿色屏幕会话中使用我的库列表在STRSQL中成功地执行这个过程,如上所述,但这是错误的。它不起作用。它只是说“触发程序或外部例程检测到错误。”对于错误信息,我深表歉意

当从客户端调用MYLIB/TESTPROC时(
CALL MYLIB/TESTPROC
),它会因CPF9810而失败(找不到库&1)。我通过I Navigator->runsql脚本连接到数据库。在Connection->JDBC设置中,我有默认的SQL模式='Use library list of server job',并设置模式列表=QGPL、QTEMP、VENDRLIB1、VENDRLIB2、VENDRLIB3。然后我执行了
调用MYLIB/TESTPROC
,得到了如上所述的消息

当我运行该程序时,即在绿色屏幕命令行上调用MYLIB/TESTPRG

TESTPRG是一个不带参数的C程序。存储过程的定义如下:

创建过程MYLIB/TESTPROC
C语言
特定MYLIB/TESTPROC
不确定
无SQL
调用空输入
外部名称“MYLIB/TESTPRG”
参数样式一般;

CPF9810-找不到库&1
表示有人试图访问库
&1
(不管是什么,您没有告诉我们),并且键入的库不在系统的任何位置&1不是库的名称,它是一个替换变量,将在作业日志中显示库名称。查看作业日志中的真实库拼写。检查你的拼写。检查连接以确保正确指定了所有库。该消息将准确地告诉您是哪个库导致了问题

如果程序在正确设置库列表时确实在绿色屏幕上工作,那么我认为问题出在您的连接中,它正在尝试设置库列表。不能将不存在的库添加到库列表中。这就是为什么它在绿色屏幕下工作,您的库必须在那里正确键入,否则它将不在库列表中。如果您试图将带有拼写错误的库添加到绿色屏幕中的库列表中,则会出现类似的错误(相同的文本,不同的错误代码)


找出消息的全文(查看作业日志),您将看到抛出错误的内容以及库是什么。提示,SQL不太可能抛出错误,因为这些错误看起来都像SQL或SQ。更有可能是CL命令或其处理程序被发送CPF消息的IBM服务器调用。

CPF9810-未找到库&1表示有人试图访问库
&1
(不管是什么,您没有告诉我们),并且键入的库不在系统的任何位置&1不是库的名称,它是一个替换变量,将在作业日志中显示库名称。查看作业日志中的真实库拼写。检查你的拼写。检查连接以确保正确指定了所有库。该消息将准确地告诉您是哪个库导致了问题

如果程序在正确设置库列表时确实在绿色屏幕上工作,那么我认为问题出在您的连接中,它正在尝试设置库列表。不能将不存在的库添加到库列表中。这就是为什么它在绿色屏幕下工作,您的库必须在那里正确键入,否则它将不在库列表中。如果您试图将带有拼写错误的库添加到绿色屏幕中的库列表中,则会出现类似的错误(相同的文本,不同的错误代码)


找出消息的全文(查看作业日志),您将看到抛出错误的内容以及库是什么。提示,SQL不太可能抛出错误,因为这些错误看起来都像SQL或SQ。更有可能是CL命令或其处理程序被发送CPF消息的IBM服务器调用。

正如您所发现的,您可以直接调用简单程序,而无需根据IBM提供的以下文档定义外部SQL过程:

我相信为简单程序创建自己的外部过程定义的建议主要是为了减少歧义。如果您的程序和过程恰好有匹配的名称,那么您需要知道规则列表,以确定调用的是哪一个


此外,外部函数的规则与外部存储过程的规则不同,这些规则也会混淆。

正如您所发现的,您可以直接调用简单程序,而无需根据IBM的以下文档定义外部SQL过程:

我相信为简单程序创建自己的外部过程定义的建议主要是为了减少歧义。如果您的程序和过程恰好有匹配的名称,那么您需要知道规则列表,以确定调用的是哪一个


此外,外部函数的规则与外部存储过程不同,它们也会混淆。

根据我的评论,我通常使用call命令中的库进行过程调用

在使用CALL PGM(MYLIB/TESTPROC)的终端会话中。或者在SQL会话中使用调用MYLIB.TESTPROC

这可以防止有人无意中将您的过程放入个人库等。我通常不指定会话库