2016-07-26 4 views
0

次のスクリプトでは、4000文字のsubstrを実行しようとすると、特定のIDのすべてのテキストがDBフィールドID言語を増やしても、4001 dbでもエラーが表示されます - ora-06502:pl/sql:数値または値のエラーです。4000文字以上のSubstrは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

また、エラースタック全体とその関数の呼び出し方法を示します。テキスト全体が必要な場合は、なぜCLOBではなくVARCHAR2を戻していますか? –

+1

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-wing-asking-a-question/285557#285557 –

+0

申し訳ありません、私今編集しました。 –

答えて

2

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文字の値を代入しようとしている、それはあなたが見ているエラーの原因となっています。

PL/SQLコンテキストとバインド変数を使用するようにSAP呼び出しを変更して、戻り値を取得することもできますが、それでも32kに制限されます。 CLOBとして値を保持するように関数を変更すると、テーブルから値を取得するだけで機能が少し無意味になります。私はSAPに精通していないので、いずれのアプローチをどのようにコーディングするのかは分かりません。

+0

これはずっと良くて正確なので私の答えを削除しました。 – Unoembre

関連する問題