LoginSignup
0
1

More than 5 years have passed since last update.

RPAD/LPAD関数の不思議な挙動を試す (Oracle Database 12c Release 2)

Last updated at Posted at 2018-07-03

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を変更することで拡張することができます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1