Monday, October 19, 2009

オラクルが知らせてくれないオラクルの小さなチップ#1

文字列内で単一引用符号(Single Quotation Mark)を使ったら次のようにエラーが発生します。

UKJA@ukja1021> select 'My name is 'ukja'' from dual;
select 'My name is 'ukja'' from dual
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

こんな場合には次のように単一引用符号を二つに付けて使用しなければなりません。

UKJA@ukja1021> select 'My name is ''ukja''' from dual;

'MYNAMEIS''UKJA''
-----------------
My name is 'ukja'

問題はこの場合可読性(Readibility)が著しく落ちるということです。次の簡単な文字列だけでも目が痛いぐらいです。

UKJA@ukja1021> declare
2 v_sql varchar2(10000);
3 begin
4 v_sql := 'insert into t1 values(''a'', ''b'',' || '''d''' || ', ''e'')';
5 end;
6 /

PL/SQL procedure successfully completed.

この可読性の問題は時には相当に深刻になります。私の個人的な経験談ですが、複雑な文字列を動的に生成する過程で、多い単一引用符号が使用されながらエラーを捜すにだけ数時間がかかったこともあります。


幸いにOracle10gからはつぎのように引用オペレーター(Quote Operator. q)が使えます。


UKJA@ukja1021> select q'[My name is 'ukja']' from dual;

Q'[MYNAMEIS'UKJA'
-----------------
My name is 'ukja'

文字列が複雑になるほど効果は大きいです。

UKJA@ukja1021> declare
2 v_sql varchar2(10000);
3 begin
4 v_sql := q'[insert into t1 values('a', 'b',]' || q'['d']' || q'[, 'e')]';
5 end;
6 /

PL/SQL procedure successfully completed.

次のように大部分の文字を区切り記号(Delimiter)で使えます。

UKJA@ukja1021> select q'[My name is 'ukja']' from dual;

Q'[MYNAMEIS'UKJA'
-----------------
My name is 'ukja'

UKJA@ukja1021> select q'#My name is 'ukja'#' from dual;

Q'#MYNAMEIS'UKJA'
-----------------
My name is 'ukja'

UKJA@ukja1021> select q'(My name is 'ukja')' from dual;

Q'(MYNAMEIS'UKJA'
-----------------
My name is 'ukja'

UKJA@ukja1021> select q'*My name is 'ukja'*' from dual;

Q'*MYNAMEIS'UKJA'
-----------------
My name is 'ukja'

UKJA@ukja1021> select q'xMy name is 'ukja'x' from dual;

Q'XMYNAMEIS'UKJA'
-----------------
My name is 'ukja'

これ以上単一引用符号を探すのに数時間を無駄に使う必要がなくなるはずです。

No comments:

Post a Comment