超过 4000 个字符的 Substr 得到 ORA-06502: PL/SQL: numeric or value error
Posted
技术标签:
【中文标题】超过 4000 个字符的 Substr 得到 ORA-06502: PL/SQL: numeric or value error【英文标题】:Substr with more than 4000 characters gets ORA-06502: PL/SQL: numeric or value error 【发布时间】:2016-07-26 17:25:00 【问题描述】:在下面的脚本中,如果我尝试 substr 为 4000 个字符,它可以工作并显示我的特定 ID 中的所有文本以及相应的 DB 字段 ID 和语言,如果我增加它,甚至 4001 db 会弹出错误 - ora-06502: pl /sql: 数值或数值错误。
Create or replace function GET_AER_TEXT5(M_AER_ID IN NUMBER,
F_ID IN VARCHAR2,PREF_LANGUAGE IN VARCHAR2)
IS
AERTEXT VARCHAR2(32000);
LANG_PARAM VARCHAR2(2000);
AER_CLOB CLOB;
BEGIN
FOR c1 IN (
select TEXT from AER_TEXT
where FIELD_ID=F_ID and AER_ID=M_AER_ID and LANGUAGE IN(PREF_LANGUAGE)
)
LOOP
IF c1.text IS NOT NULL THEN
AER_CLOB:=AER_CLOB || c1.text;
END IF;
END LOOP;
AERTEXT:=substr(AER_CLOB,1,4000);
RETURN(AERTEXT);
END;
将此增加到 4000 以上的重要性是提取完整的文本数据。如果 DB 列包含超过 4K 的字符,则它不起作用。
我是这样称呼它的:
select AER_ID,GET_AER_TEXT5(AER_ID,at,field_id,'001')
from AER a,AER_TEXT AT
where AT.field_ID=12345 and a.aer_id=at.aer_id;
您能否建议如何摆脱这个问题。
【问题讨论】:
还显示整个错误堆栈,以及函数是如何被调用的。如果您想要整个文本,为什么要返回 VARCHAR2 而不是 CLOB? meta.***.com/questions/285551/… 对不起,我已经编辑过了。 我将在 SAP 业务对象报告中使用它来根据我的客户要求调用少量数据。下面是我的查询。 select AER_ID,GET_AER_TEXT5(AER_ID,at,field_id,'001') from AER a,AER_TEXT AT where AT.field_ID=12345 and a.aer_id=at.aer_id; 感谢您使用文本,但您现在需要对其进行格式化。这将有所帮助:***.com/help/formatting 【参考方案1】:在 Oracle 12c 之前,Oracle 仅允许在 SQL 上下文中的 varchar2 值中包含 4000 个字节。在 PL/SQL 中允许使用 32k,因此即使 substrng 获得前 4001 个字符,您的函数也可以正常使用;但前提是你从 PL/SQL 调用它。当您尝试从 SQL 调用它时:
select AER_ID,GET_AER_TEXT5(AER_ID,at,field_id,'001') ...
...您尝试将 4001 个字符的值分配给 return 语句中的隐式 SQL 列,这导致了您看到的错误。
您可以更改您的 SAP 调用以使用 PL/SQL 上下文和绑定变量来获取返回值,但您仍将被限制为 32k;或更改您的函数以将值保留为 CLOB,这使得该函数有点毫无意义,因为您可以从表中获取值。我对 SAP 不熟悉,所以我不太确定您最终会如何编写这两种方法。
【讨论】:
删除了我的答案,因为这样更好更准确。以上是关于超过 4000 个字符的 Substr 得到 ORA-06502: PL/SQL: numeric or value error的主要内容,如果未能解决你的问题,请参考以下文章