Ibm midrange 执行SELECT INTO时获取SQL错误代码

Ibm midrange 执行SELECT INTO时获取SQL错误代码,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我正在RPGLE中执行选择进入。它在开发过程中运行良好,但在部署到生产环境时,它开始给我一个SQL错误。SQL错误为: -579(当函数或过程的定义未指定此操作时,对象类型对象名称试图读取数据) 请注意,表1(也被更改,添加了一个字段,用于此请求,并与程序一起移动到生产中)仅在下面的语句中使用,未在F-spec中声明 试图在开发环境中重新创建此功能,但运气不佳。此程序由多个程序调用,但它们不会为这些程序创建作业日志。调用堆栈的开头总是有一个存储过程(程序总是从SP调用) 我认为这与呼叫程序中的某

我正在RPGLE中执行
选择进入
。它在开发过程中运行良好,但在部署到生产环境时,它开始给我一个SQL错误。SQL错误为:

-579(当函数或过程的定义未指定此操作时,对象类型对象名称试图读取数据)

请注意,表1(也被更改,添加了一个字段,用于此请求,并与程序一起移动到生产中)仅在下面的语句中使用,未在F-spec中声明

试图在开发环境中重新创建此功能,但运气不佳。此程序由多个程序调用,但它们不会为这些程序创建作业日志。调用堆栈的开头总是有一个存储过程(程序总是从SP调用)

我认为这与呼叫程序中的某些设置有关

Exec Sql Select WHS                            
           into :WHS1                         
           from Table1
           Where Company = :COMP
             and WHS = :WHSE;                     

此程序是从多个存储的进程调用的。它们中的一些有一个
包含SQL


包含SQL
表示函数可能包含一些SQL,但它不会通过SQL读取或写入存储在数据库中的任何数据。例如SET。对于存储过程中的
包含SQL
,如果该过程或它调用的过程尝试使用SQL读取数据库,则它将失败。如果存储过程没有
包含SQL
,则默认情况下存储过程将采用
修改SQL数据
,并且不会失败

此程序是从多个存储过程调用的。它们中的一些有一个
包含SQL


包含SQL
表示函数可能包含一些SQL,但它不会通过SQL读取或写入存储在数据库中的任何数据。例如SET。对于存储过程中的
包含SQL
,如果该过程或它调用的过程尝试使用SQL读取数据库,则它将失败。如果存储过程没有
包含SQL
,则默认情况下存储过程将采用
修改SQL数据
,并且不会失败

您正在使用函数吗?如果标量函数或表函数返回查询,则该函数必须具有读取SQL数据或修改SQL数据的数据访问分类。表1是一个表函数吗?如果是,您还必须更改sql…您好,实际上这个程序是从多个存储过程调用的。其中一些具有“包含SQL”,而另一些没有。起初,我认为这可能是个问题。然后我创建了一个SP和一个程序(包含SQL语句)。我尝试了所有组合(读取SQL数据、修改SQL数据、包含SQL),但没有得到错误。当我没有使用SQL时,它给了我一个-487SQLCODE,这与-579H非常相似,我可以重新创建它。我用“CONTAINS SQL”创建了一个SP,它用SQL语句调用一个RPG。SP:“createprocedure&LIB/JJTESTSP()外部名称&LIB/JJTESTRPG语言rpglecontainsesql”RPG中的SQL给了我一个-579。我在这里有点困惑。这表示它包含SQL。那为什么它会在RPG中崩溃呢?如果我删除“CONTAINS SQL”,它不会首先中断,
CONTAINS SQL
在这里不起作用。它至少需要
读取SQL数据
,因为您正在从表中读取数据。如果删除
包含SQL
它不会中断的原因是它默认为
修改SQL
,这比
包含SQL
的权限更大。另外,你能详细解释一下吗?根据您的评论,这是从存储过程调用的吗?请把它和用于创建存储过程的设置一起放在问题中。非常感谢!我已经更新了这个问题(在写这个问题时,我不知道存储过程在这个场景中的重要性),您使用的是函数吗?如果标量函数或表函数返回查询,则该函数必须具有读取SQL数据或修改SQL数据的数据访问分类。表1是一个表函数吗?如果是,您还必须更改sql…您好,实际上这个程序是从多个存储过程调用的。其中一些具有“包含SQL”,而另一些没有。起初,我认为这可能是个问题。然后我创建了一个SP和一个程序(包含SQL语句)。我尝试了所有组合(读取SQL数据、修改SQL数据、包含SQL),但没有得到错误。当我没有使用SQL时,它给了我一个-487SQLCODE,这与-579H非常相似,我可以重新创建它。我用“CONTAINS SQL”创建了一个SP,它用SQL语句调用一个RPG。SP:“createprocedure&LIB/JJTESTSP()外部名称&LIB/JJTESTRPG语言rpglecontainsesql”RPG中的SQL给了我一个-579。我在这里有点困惑。这表示它包含SQL。那为什么它会在RPG中崩溃呢?如果我删除“CONTAINS SQL”,它不会首先中断,
CONTAINS SQL
在这里不起作用。它至少需要
读取SQL数据
,因为您正在从表中读取数据。如果删除
包含SQL
它不会中断的原因是它默认为
修改SQL
,这比
包含SQL
的权限更大。另外,你能详细解释一下吗?根据您的评论,这是从存储过程调用的吗?请把它和用于创建存储过程的设置一起放在问题中。非常感谢!我已经更新了问题(在编写问题时,我不知道存储过程在这个场景中的重要性),我更新了答案以消除隐含的不准确之处。特别是:存储过程调用的RPG过程可以更新数据库,即使存储过程是用
包含SQL
定义的。但是,这些更新必须使用传统的记录级访问而不是SQL来完成。非常感谢Mark。事实上,我所做的修复是使它成为链式的,而不是SQL,它成功了!我更新了答案,删除了