超过4000个字符的Substr获取ORA-06502:PL/SQL:numeric或value错误

超过4000个字符的Substr获取ORA-06502:PL/SQL:numeric或value错误,sql,oracle,plsql,oracle10g,clob,Sql,Oracle,Plsql,Oracle10g,Clob,在下面的脚本中,如果我尝试为4000个字符设置substr,它会工作,并使用相应的DB字段ID和语言显示特定ID中的所有文本,如果我将其增加到4001 DB,则会弹出错误-ora-06502:pl/sql:numeric或value error Create or replace function GET_AER_TEXT5(M_AER_ID IN NUMBER, F_ID IN VARCHAR2,PREF_LANGUAGE IN VARCHAR2) IS AERTEXT VARCHAR

在下面的脚本中,如果我尝试为4000个字符设置substr,它会工作,并使用相应的DB字段ID和语言显示特定ID中的所有文本,如果我将其增加到4001 DB,则会弹出错误-ora-06502:pl/sql:numeric或value error

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;

您能否建议如何解决此问题。

在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') ...
。。。您试图在return语句中为隐式SQL列指定一个4001个字符的值,这导致了您看到的错误


您可以将SAP调用更改为使用PL/SQL上下文和绑定变量来获取返回值,但仍将限制为32k;或者将函数更改为将值保留为CLOB,这使得函数有点毫无意义,因为您可以从表中获取值。我不熟悉SAP,因此我不太确定您最终会如何编写这两种方法。

在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') ...
。。。您试图在return语句中为隐式SQL列指定一个4001个字符的值,这导致了您看到的错误


您可以将SAP调用更改为使用PL/SQL上下文和绑定变量来获取返回值,但仍将限制为32k;或者将函数更改为将值保留为CLOB,这使得函数有点毫无意义,因为您可以从表中获取值。我不熟悉SAP,因此我不太确定您最终将如何对这两种方法进行编码。

还将显示整个错误堆栈,以及如何调用函数。如果您想要完整的文本,为什么要返回VARCHAR2而不是CLOB?对不起,我现在已经编辑了它。我将在SAP Business object report中使用它来根据我的客户要求调用一些数据。下面是我的问题。选择AER_ID,从AER a中获取AER_文本5(AER_ID,at,field_ID,'001'),其中at.field_ID=12345和a.AER_ID=at.AER_ID;感谢您使用文本,但您现在需要将其格式化。这将有助于:还将显示整个错误堆栈,以及如何调用函数。如果您想要完整的文本,为什么要返回VARCHAR2而不是CLOB?对不起,我现在已经编辑了它。我将在SAP Business object report中使用它来根据我的客户要求调用一些数据。下面是我的问题。选择AER_ID,从AER a中获取AER_文本5(AER_ID,at,field_ID,'001'),其中at.field_ID=12345和a.AER_ID=at.AER_ID;感谢您使用文本,但您现在需要将其格式化。这将有助于:删除我的答案,因为这更好更准确。删除我的答案,因为这更好更准确。