e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第93回 「文字列連結プログラミングのコツ」

2014.04.17

こんにちは。インストラクターの蓑島です。

今回はPL/SQLだけではなく、プログラム一般に共通する事柄として、文字列連結のコツについて解説したいと思います。
私なりのコツですが、皆さんのヒントになってくれれば幸いです。

まず、プログラムで変数などを連結して長い文字列を生成することは普通によくあることですね。
例えば、最近のシステムはWEBアプリケーションですから、WEBページ(HTMLドキュメント=文字列の塊)をプログラムで生成することがあたりまえです。あるいは本メルマガでもご紹介した動的SQL(バックナンバー第43回~第47回)は、文字列のSQL文を実行するものなので、文字列連結を駆使してSQL文を組み立て実行します。

このように、いろいろな場面で変数などを連結して長い文字列をプログラムで組み立てるわけですが、これが苦手である人は多いのではないでしょうか?

しかし文字列連結にはちょっとしたコツがあり、それがわかれば、どれだけ長い文字列であっても、どんなに複雑であっても、楽に確実に文字列を組み立てることができるようになります。
今日はぜひ、その方法を解説したいと思います。

まず、よくないやり方は、まともに変数を左から右へ順番に連結する方法です。
これはとても自然な方法ではあるのですが、長い文字列になるほど間違える可能性があります。

そこで、お勧めの方法は以下のような方法です。

まず、文字列連結の完成形を用意します。
そして、その文字列の中で変数で置き換えたい部分を周りの文字列から分離するのです。
その分離した文字列を変数に置き換えるという方法です。

とても簡単なことです。以下の例の手順をご覧ください。

  • 完成形の文字列を用意する。 10が変数による値。
    V_SELECT := 'SELECT * FROM EMP WHERE DEPTNO = 10 ORDER BY ENAME';
  • 「10」の前後に区切り文字(')2個挿入。
    V_SELECT := 'SELECT * FROM EMP WHERE DEPTNO = ''10'' ORDER BY ENAME';
  • 区切り文字2個の間に連結記号(||)を挿し入れて間の「'10'」を周りから分離。
    V_SELECT := 'SELECT * FROM EMP WHERE DEPTNO = ' || '10' || ' ORDER BY ENAME';
  • これにより「'10'」が周りから分離されている。
    V_SELECT := 'SELECT * FROM EMP WHERE DEPTNO = ' || '10' ||' ORDER BY ENAME';
  • その部分を変数で置き換える。
    V_SELECT := 'SELECT * FROM EMP WHERE DEPTNO = ' || TO_CHAR(V_DEPTNO) ||' ORDER BY ENAME';

まず最初に1.ですが、完成版の文字列の例として、SELECT文の文字列をV_SELECTという変数に代入しています。 ここで、このSELECT文の中の「10」の部分が変数による値だとします。

次に2.ですが、「10」の前後に、文字列の区切り文字(PL/SQLの場合はシングルコート)2個挿入します。

次に3.ですが、挿入したシングルコート2個の間に、文字列の連結記号(PL/SQLの場合は || )を挿し入れて、間の「'10'」を分離します。
私にとってはこの操作はあたかも羊羹(ヨウカン)を包丁でストン、ストンと切っている感覚です。なお||の前後に空白を入れると見やすくなります。

次に4.ですが、これまでの操作によって間の「'10'」は周りから切り離されて分離している個別の文字列そのものです。

よって手順5.で、その部分を変数に置き換えている訳です。
ここではV_DEPTNOという変数が数値の変数なので、TO_CHAR関数によって文字列に変換したもので置き換えているというストーリです。

なお、文字列の中にシングルコートそのものがふくまれる時は、ご存知の方も多いと思いますが、PL/SQLでは、シングルコート2個で表します。
しかし、そうすると上記の手順で文字列を分離させるためのシングルコート2個と混同しますのでたいへんわかりにくくなります。
そこでそのような場合、私はいったん、文字列の中のシングルコートをダブルコートに置き換えて、上記の操作を行います。
そして最後にダブルコートをシングルコート2個に置換してもとの状態に戻すといったやり方をとってます。
例えば、以下の手順をご覧ください。

  • PL/SQLでは文字列の中のシングルコートはシングルコート2個で表す。
    よって、SELECT * FROM EMP WHERE ENAME = 'SMITH' を文字列にするケースは以下のようになる。
    V_SQL := 'SELECT * FROM EMP WHERE ENAME = ''SMITH''';
  • しかしこれではわかりにくいので、ダブルコート一つに置き換える。
    V_SQL := 'SELECT * FROM EMP WHERE ENAME = "SMITH"';
  • ここから先は上記の手順とまったく同じ。すなわち文字列「SMITH」を分離するため、前後にシングルコート2個を挿入。
    V_SQL := 'SELECT * FROM EMP WHERE ENAME = "''SMITH''"';
  • シングルコート2個の中に連結記号(||)を挿入。
    V_SQL := 'SELECT * FROM EMP WHERE ENAME = "' || 'SMITH' || '"';
  • 連結記号(||)の間の'SMITH'を変数に置き換える。
    V_SQL := 'SELECT * FROM EMP WHERE ENAME = "' || V_ENAME || '"';
  • 最後にダブルコーテート(")をシングルコート2個('')に置換して戻す。
    V_SQL := 'SELECT * FROM EMP WHERE ENAME = ''' || V_ENAME || '''';

いかがですか? 
文字列の中にシングルコートが含まれるときは、シングルコートが2個連続しますので、その状態でさらに文字列連結をすると、シングルコートが何個も連続してたいへん間違えやすく面倒です。
しかし、上記の手順のように、いったんシングルコート2個をダブルコート1個に置き換えれば、単純に考えることができますので簡単です。
最後にダブルコートをシングルコート2個に戻しておけばOKです。

文字列という羊羹(ヨウカン)を包丁でストン、ストンと切るようにして変数に置き換えたい部分を分離させ、その部分を変数に置き換えていく。
このような手順で文字列連結の記述をすれば、どんなに長く複雑な文字列でも正確に組み立てることができます。

それでは今回はここまでです。皆さんのプログラミングの参考になれば幸いです。
なお、文字列連結でSQL文を組みたてる場合は、今回解説していませんが、バインド変数を使うことが推奨されています。
次回はSQL文の文字列連結におけるバインド変数について解説したします。ご期待ください。

先頭へ戻る