2013/05/14

SQL*PLUSで"&"(アンパサンド)を使いたい

■SQL*PLUSで"&"を使いたい・・・

先日SQL*PLUSで実行するSQL文の中に"&"(アンパサンド)を入れたいことがありました。
具体的にはカラムにURL文字列をそのまま格納したかったんです。

INSERT INTO table VALUES ('xxx','yyy','http://abcde.com/main.jsp?abc=ABC&def=DEF');

といった感じです。

しかし、Oracle先生はこんな質問をしてきます。


 defに値を入力してください:


いやいやそういうことではないんですよ・・・


■"&"を無視してもらう

"&"(アンパサンド)を無視してもらう方法は簡単です。

 SET DEFINE OFF

これだけです。


SQL*Plusにおいて"&"はデフォルトの置換変数として定義されています。
その定義をOFFにするおまじないです。

そもそも置換変数とは、SQL内の文字列を指定された内容に置き換えることができる変数です。
シェルスクリプトなどで引数として渡すことによって内容をします。

例えば、select.sqlというファイルに
 select * from emp where name = '&1';
と書かれており、
 
 SQL> @select.sql

と実行すると、


 1に値を入力してください:


となります。
そこで以下のように引数を与えてあげると

 SQL> @select.sql 山田
 旧   1: select * from emp where name = '&1'
 新   1: select * from emp where name = '山田'
 
 NAME
 ----------
 山田


と、めでたく&1の文字列が置換されました。




しかし、もし"&"が含まれるデータをWHERE句で指定したい場合、
(=select.sqlに書かれているSQLをそのまま実行したい場合)
どうしてもOracle先生から質問されてしまいます。


 SQL> @select
 1に値を入力してください: &1
 旧   1: select * from emp where name = '&1'
 新   1: select * from emp where name = '&1'

 NAME
 ----------
 &1


このように入力が必要になってしまうので、シェルスクリプトなどでは困ってしまいます。
そこで、遂に登場です。

 SET DEFINE OFF

このおまじないを唱えると


 SQL> set define off
 SQL> @select

 NAME
 ----------
 &1

と直接実行することができます。




ちなみに、
 SET DEFINE ON
と唱えるとまた"&"が置換変数の接頭語として扱われ、
 SET DEFINE #
と唱えると"#"が置換変数の接頭語に変わります。
ただし、英数字または空白は使用できません。


0 件のコメント:

コメントを投稿