RPAD/LPAD関数の仕様
RPAD関数は、指定された文字列の右側に(LPAD関数は左側に)特定の文字を繰り返して文字列を返します。関数の動作はマニュアルには以下のように記述されています。
LPADは、expr1の左側にexpr2に指定した文字を連続的に埋め込んでn桁にして戻します。このファンクションは、問合せの出力の書式設定に役立ちます
通常の動作
下記の例では文字列'A'の左側に'B'を連続して埋め込み、全体を10文字にして返します。'B'が連続して出力され、10文字目が'A'になっています。
SQL> SELECT LPAD('A', 10, 'B') LPAD FROM DUAL;
LPAD
----------
BBBBBBBBBA
マルチバイト文字を指定した場合の動作
文字コードがAL32UTF8の環境(データベース、クライアントとも)で、この関数を実行してみると想定と異なる結果が得られました。
まるでフォント幅にあわせて出力長を変えているように見えます。全角文字は半角文字の半分の文字数になり、半角カナは半角英数と同じ文字数が出力されました。
SQL> SELECT LPAD('あ', 10, 'か') LPAD FROM DUAL;
LPAD
---------------
かかかかあ
SQL> SELECT LPAD('あ', 10, 'B') LPAD FROM DUAL;
LPAD
-----------
BBBBBBBBあ
SQL> SELECT LPAD('ア', 10, 'イ') LPAD FROM DUAL;
LPAD
------------------------------
イイイイイイイイイア
桁数を拡大した時の動作
マニュアルには桁数に対する制限について説明がありませんので、この値を拡大してみます。32768文字を指定しましたが、実際には4000バイトまでしか生成されません。初期化パラメーターmax_string_size=EXTENDEDを指定した場合はこの値は拡大されるようです。
SQL> SELECT LENGTHB(LPAD('A', 32768, 'B')) LPAD_LENGTH FROM DUAL;
LPAD_LENGTH
-----------
4000
PL/SQL環境とSQL環境の動作の違い
同じ関数でも PL/SQL の文で使う場合と、SQL文内で使う場合の検証を行いました。下記のようなPL/SQLプログラムを実行します。
変数 v1 には SELECT文内で実行したRPAD関数の長さが格納されます。変数 v2 には PL/SQL文内で実行したRPAD関数の長さが格納されます。
DECLARE
v1 VARCHAR2(32767);
v2 VARCHAR2(32767);
BEGIN
SELECT RPAD('A', 32767, 'B') INTO v1 FROM DUAL;
DBMS_OUTPUT.PUT_LINE('SQL: ' || to_char(LENGTH(v1)));
v2 := RPAD('A', 32767, 'B');
DBMS_OUTPUT.PUT_LINE('PL/SQL: ' || to_char(LENGTH(v2)));
END;
/
実行結果は以下の通りです。同じ関数でも実行される場所により実行結果が異なる場合があることがわかります。
SQL: 4000
PL/SQL: 32767
PL/SQLプロシージャが正常に完了しました。
(参考)データ型による制限
Oracle Databaseの文字列はデータ型によって最大バイト数が決まっています。
データ型 | 最大バイト数 (11.2まで) | 最大バイト数 (12.1から) | PL/SQLの最大長 |
---|---|---|---|
CHAR | 2000 | 2000 | 32767 |
NCHAR | 2000 | 2000 | 32767 |
VARCHAR2 | 4000 | 32767 | 32767 |
NVARCHAR2 | 4000 | 32767 | 32767 |
RAW | 2000 | 32757 | 32767 |
Oracle Database 12c以降は、初期化パラメーターmax_string_sizeを変更することで拡張することができます。