pl/sql 関数 substr は、たとえばsubstr('some text', 1, 4)
、4 文字を超えるデータ型を返します。
以下が機能しない理由を理解するのが難しい:
rowTxt VARCHAR2(60);
rowTxt := substr(text, (pos + 1), 60);
いつも私は例外を得ました
ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます
誰か理由を教えてください。
乾杯ヒルデ
おそらくこれは nls_length_semantics に関係しています。
Varchar2(60) は 60 文字を意味する場合がありますが、60 バイトを意味する場合もあります。nls_length_semantics が BYTE に設定されている場合、60 バイトを意味します。
SUBSTR(,1,60) は 60 文字を返します。これらの文字の 1 つ以上が 1 バイトを超える場合、例外が発生します。
これを試すには、文字列を VARCHAR2(60 CHAR) として宣言します。
http://www.oracle-base.com/articles/9i/character-semantics-and-globalization-9i.php
結果のサイズは、パラメーターから推測されません。多くの場合、とにかくそれは不可能です。
これを解決するには、Cast(substr(text, (pos + 1), 60) as varchar2(60)) を使用します。