执行 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 异常

如何修复此 SELECT 语句中的错误 INTO 子句

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)

使用 SELECT ... INTO 在 SQL Server 中创建表

在 SQL 中使用 SELECT INTO 创建新表 [重复]