暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 服务器和plsql开发人员执行过程的不同行为

ASKTOM 2020-05-29
292

问题描述

嗨,
我要在这里解释的问题有点奇怪和奇怪。
直接讨论这个问题; 有一个包含10个程序的软件包。其中一个叫休息9程序一个接一个。
在9过程之一中,它抛出异常为:

ERROR:  ORA-01489: result of string concatenation is too long Failed
复制


对象: 表 _ 1
并且其中出现错误的查询是:

SELECT COLUMN1 ,
 LISTAGG(COLUMN2, '<>') WITHIN GROUP( ORDER BY ID) TITLE
                                                            FROM TABLE2 B
                                                           WHERE B.COLUMN1 NOT IN ('111222','333444') 
                                                           AND TRIM(COLUMN1) IS NOT NULL
                                                           GROUP BY COLUMN1
复制


但是,当我在plsql developer中分别执行相同的过程时,它运行绝对正常,没有任何错误。

我无法弄清楚同一过程的行为和行为方式不同; 一个是通过autosys作业执行 (或直接从服务器执行),另一个是通过plsql开发人员工具执行。

这是我第一次面临这样奇怪的问题。任何指导/帮助将不胜感激。

我可以轻松地处理该错误,但首先需要弄清楚为什么通过plsql developer执行相同的过程不会给出任何错误。

如果这对任何人来说听起来都很愚蠢,请原谅我,但请相信我,这是我一周以来观察到的情况。

提前谢谢。:)

专家解答

当listagg返回长度超过varchar2限制 (4,000或32,767字节,取决于您的max_string_size设置) 的字符串时,您会收到ORA-01489错误。

最可能的原因是过程中的调用是事务的一部分,因此您可以看到不同的数据。

您确定运行查询时表中的值与出错时相同吗?

您可以使用overflow子句避免错误:

listagg ( ... on overflow truncate ) 
复制


但这会导致数据丢失。还有其他解决方法-请参阅:

https://blogs.oracle.com/datawarehousing/managing-overflows-in-listagg
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论