超过4000个字符的Substr得到ORA-06502:PL / SQL:数字或值错误

时间:2016-07-26 17:25:01

标签: sql oracle plsql oracle10g clob

在下面的脚本中,如果我尝试使用字符串为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;

你能否告诉你如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

在Oracle 12c之前,Oracle仅允许在SQL上下文中的varchar2值中使用4000个字节。在PL / SQL中你被允许32k,所以你的功能就像它的立场一样好,即使你的字符串获得前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,所以我不太确定你最终会采用哪种方式进行编码。