太った空白 Tweet
書こうか迷っていたのだが、意外とハマっている方が多いらしいので書いておく事にした。
まあ、エラーメッセージがわかりずらいのでしょうがないとは思うが。
PL/SQLで開発する際に出くわす事がある。
(私もたまにやっちゃいますけどハマることはないです。こればかりは慣れるしかないですね。)
ということで太った空白のお話。
PL/SQLではマルチバイト文字の空白(全角の空白と言ったほうがわかりやすいでしょうか?)が原因で意味不明のコンパイルエラーを引き起こす。
そう、”太った空白”と書いたのはマルチバイト文字の空白。半角の空白が2つあるように見えるが全角の空白が1文字。
まずは、以下の例を見てください。
Last login: Fri Dec 21 08:25:31 on console
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Sun Dec 16 18:02:52 2007 from 192.168.1.19
[oracle@corydoras ˜]$ sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on 金 12月 21 19:50:10 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
> conn scott/tiger
接続されました。
SCOTT> create or replace function now
2 return timestamp
3 is
4 begin
5 return systimestamp;
6 end;
7 /
警告: ファンクションが作成されましたが、コンパイル・エラーがあります。
SCOTT> show errors
FUNCTION NOWのエラーです。
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3 PLS-00103: 記号""が見つかりました。 次のうちの1つが入るとき:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
記号"" は無視されました。
上記では、now()というストアドファンクションを作成しようとして5行目の3カラム目でコンパイルエラーが発生している。
(ストアドファンクション自体は意味の無いものなので気にしないでね。コンパイルエラーに注目してください。)
5行目の3カラム目は、"r"だなと思ったあなたは、もうすでにハマっていますよ。
実は、5行目の先頭の空白は半角の空白2文字ではなく”全角の空白1文字”なんです。
もうお分かりですよね。では、全角空白1文字を半角空白2文字に置換して再実行してみましょう。
SCOTT> list 5
5* return systimestamp;
SCOTT> c / return/ return
5* return systimestamp;
SCOTT> l
1 create or replace function now
2 return timestamp
3 is
4 begin
5 return systimestamp;
6* end;
SCOTT> /
ファンクションが作成されました。
SCOTT> select now() from dual;
NOW()
---------------------------------------------------------------------------
07-12-21 19:56:19.046993000
SCOTT> /
| 固定リンク | 0


コメント