执行 SELECT INTO 时获取 SQL 错误代码
Posted
技术标签:
【中文标题】执行 SELECT INTO 时获取 SQL 错误代码【英文标题】:Getting a SQL error code when doing a SELECT INTO 【发布时间】:2019-01-21 04:50:07 【问题描述】:我正在我的 RPGLE 中执行select into
。它在开发中运行良好,但在部署到生产环境时开始给我一个 SQL 错误。 SQL 错误是:
-579(当函数或过程的定义未指定此操作时,尝试读取数据的对象类型对象名称)。
请注意,TABLE1(也已更改,为此请求添加了一个字段,并与程序一起移至生产环境)仅在以下语句中使用,而不在 F-spec 中声明。
试图在开发环境中重新创建它,但没有运气。该程序是从多个程序中调用的,但它们不会为这些程序创建作业日志。调用堆栈的开头总是有一个存储过程(程序总是从一个 SP 调用)
我认为这可能与调用程序中的某些设置有关。
Exec Sql Select WHS
into :WHS1
from Table1
Where Company = :COMP
and WHS = :WHSE;
【问题讨论】:
你在使用函数吗?如果标量函数或表函数返回查询,则函数必须具有 READS SQL DATA 或 MODIFIES SQL DATA 的数据访问分类。 TABLE1 是一个表函数?如果是,您还必须更改您的 sql... 您好,其实这个程序是从多个存储过程中调用的。其中一些具有“包含 SQL”,而另一些则没有。最初,我认为这可能是问题所在。然后我创建了一个 SP 和一个程序(其中有 SQL 语句)。我尝试了所有组合(读取 SQL 数据,修改 SQL 数据,包含 SQL),但我没有收到错误。当我使用 NO SQL 时,它给了我一个 -487 SQLCODE 与 -579 非常相似 我可以重新创建这个。我用“CONTAINS SQL”创建了一个 SP,它用 SQL 语句调用了一个 RPG。 SP:“创建过程 &LIB/JJTESTSP () 外部名称 &LIB/JJTESTRPG 语言 RPGLE 包含 SQL” RPG 中的 SQL 给了我 -579。我在这里有点困惑。这表示它包含 SQL。那为什么它会在RPG中打破呢?如果我删除“CONTAINS SQL”,它不会中断 首先,CONTAINS SQL
在这里行不通。它至少需要READS SQL DATA
,因为您正在从表中读取数据。如果您删除CONTAINS SQL
,它不会中断的原因是因为它默认为MODIFIES SQL
,它比CONTAINS SQL
具有更大的权限。另外,你能扩大你的解释吗?根据您的评论,这是从存储过程中调用的吗?请将其与用于创建存储过程的设置一起放在问题中。
非常感谢!我已经更新了问题(在写问题时,我不知道存储过程在这种情况下的重要性)
【参考方案1】:
这个程序是从多个存储过程中调用的。其中一些包含Contains SQL
。
CONTAINS SQL
表示该函数可能包含一些 SQL,但它不会通过 SQL 读取或写入存储在数据库中的任何数据。示例包括 SET。在存储过程中使用CONTAINS SQL
,如果该过程或它调用的过程尝试使用 SQL 读取数据库,那么它会失败。如果它没有CONTAINS SQL
,则存储过程默认采用MODIFIES SQL DATA
,并且不会失败。
【讨论】:
我更新了答案以消除隐含的不准确之处。具体来说:即使存储过程是用CONTAINS SQL
定义的,存储过程调用的RPG 过程也可以更新数据库。但是,这些更新必须使用传统的记录级访问而不是 SQL 来完成。
非常感谢。实际上,我所做的修复是使其成为 CHAIN 而不是 SQL,并且成功了!以上是关于执行 SELECT INTO 时获取 SQL 错误代码的主要内容,如果未能解决你的问题,请参考以下文章
Access 2003中的SQL:INSERT INTO和多个SELECT查询
关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常
PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)