簡體   English   中英

包含4000個以上字符的Substr獲得ORA-06502:PL / SQL:數字或值錯誤

[英]Substr with more than 4000 characters gets ORA-06502: PL/SQL: numeric or value error

在下面的腳本中,如果我嘗試用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多個的重要性是提取完整的文本數據。 如果數據庫列包含的字符超過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') ...

...您正在嘗試將4001個字符的值分配給return語句中的隱式SQL列,這將導致您看到的錯誤。

您可以將SAP調用更改為使用PL / SQL上下文,並可以使用綁定變量來獲取返回值,盡管仍然限於32k。 或更改您的函數以將值保留為CLOB,這使函數有點毫無意義,因為您可以從表中獲取值。 我對SAP不熟悉,所以我不太確定您最終將如何編碼這兩種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM