2006-11-28

OracleではLimit句が使えない

ページングでSelect結果の一部のデータをしたいとき、PostgreSQLやMySQLで使用できるLimit句はとても便利。たとえばSelect結果の10から14番目までを取得するには
select * from emp where Limit 10,5
でもOracleではLimit句は使えない...

ということでOracleではROWNUMを使用してやってみる。(Oracle10g Windows版で検証)
ところがこのROWNUMは一筋縄ではいかないのであった。

Order By 句を使って並べ替えをすると、ROWNUMが...
select rownum rn
,t.住所コード
,t.市区町村名
,t.住所1
,t.住所2
from tb_住所マスタ t
order by 住所2;
結果
RN住所コード市区町村名住所1住所2
11753620300230056小松島市坂野町か里や開
21873620300230068小松島市坂野町さんた
31903620300230071小松島市坂野町のより
41573620300230038小松島市坂野町シヅ田
51423620300230023小松島市坂野町シャウ内
6763620300200002小松島市和田津開町ヒガシ
71653620300230046小松島市坂野町ミぞ口
82043620300240001小松島市間新田町ヤケ木
92343620300010008小松島市小松島町井利ノ口
103363620300100015小松島市日開野町井理守


しょーがないので副問い合わせを使用するとなんとか並ぶ
select rownum
,s.*
from (select rownum rn,
t.住所コード
,t.市区町村名
,t.住所1
,t.住所2
from tb_住所マスタ t
order by 住所2
) s
結果
   ROWNUMRN住所コード市区町村名住所1住所2
111753620300230056小松島市坂野町か里や開
221873620300230068小松島市坂野町さんた
331903620300230071小松島市坂野町のより
441573620300230038小松島市坂野町シヅ田
551423620300230023小松島市坂野町シャウ内
66763620300200002小松島市和田津開町ヒガシ
771653620300230046小松島市坂野町ミぞ口
882043620300240001小松島市間新田町ヤケ木
992343620300010008小松島市小松島町井利ノ口
10103363620300100015小松島市日開野町井理守


で10番目から14番目を取得しよう!と意気揚々であったのだが
select rownum
,s.*
from (select rownum rn,
t.住所コード
,t.市区町村名
,t.住所1
,t.住所2
from tb_住所マスタ t
order by 住所
) s
where rownum >= 10 and rownum < 15
結果
   ROWNUMRN住所コード市区町村名住所1住所2

レコードが返ってこない!なんで!

ROWNUMというのはそもそも結果セットに対して順番につけている番号だからして、それをさらに選択はできるのはおかしいということらしい。
そのためOracle 7 まではこれでよかったのだが、Oracle8からはダメになったそうだ。orz

副問い合わせで取得したROWNUMに別名をつけてやっと選択できた。
select * from 
(
select rownum rn2
,s.*
from (select rownum rn,
t.住所コード
,t.市区町村名
,t.住所1
,t.住所2
from tb_住所マスタ t
order by 住所2
) s
) a
where a.rn2 >= 10 and a.rn2 < 15
結果
   RN2RN住所コード市区町村名住所1住所2
1103363620300100015小松島市日開野町井理守
2112653620300040007小松島市堀川町井理守
3122843620300070020小松島市金磯町一番町
413773620300200003小松島市和田津開町鵜ノ松
5143963620300140003小松島市江田町姥ヶ懐


さらに改良。minus句を使用する方がパフォーマンスがよいらしいです。
select rownum
,s.*
from (select rownum rn,
t.住所コード
,t.市区町村名
,t.住所1
,t.住所2
from tb_住所マスタ t
order by 住所2
) s
where rownum <= 14
minus
select rownum
,s.*
from (select rownum rn,
t.住所コード
,t.市区町村名
,t.住所1
,t.住所2
from tb_住所マスタ t
order by 住所2
) s
where rownum < 10;


Select結果の順番なんて所詮水物ではあるのだが、やっぱり必要なのですよLimit句。
Oracleさん、ちょっとだけ考えてくれないかしら。

via Works - 逆引きSQL比較 - ROWNUM を使用した擬似スクロール・カーソル

2006-11-20

Scriptファイルをgzip圧縮

shimooka さんところからなかなかよろしいネタ。
早速メモメモ。

prototype.jsをgzip圧縮して
<script type="text/javascript" src="prototype.js.gz"></script>
で読み込むことができるんだそうです。
まあすてき。

また、こんな.htaccessファイルを置いて
RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz
(ApacheでRewriteEngine必須)
ヘッダーに
<script type="text/javascript" src="prototype.js"></script>
と書いておくと
1. Accept-Encoding に gzip を含まない場合は prototype.js をそのまま読み込む
2. Accept-Encoding に gzip が含まれ、prototype.js.gz が存在すれば prototype.js.gz を読み込む
3. Accept-Encoding に gzip が含まれ、prototype.js.gz が無ければ prototype.js を読み込む

という、理想的な動きを! ktkr!!
らしいです!

cssとかvbsでもできるのかしら。
ちょっとテストしてみます。

via [javascript]jsファイルって、gzip圧縮してもOKなんだ - Do You PHP はてな

via prototype.jsを10KBにする方法 : 亜細亜ノ蛾 - Weblog

via Compressed JavaScript - Joseph Scott's Blog

2006-11-17

[pgsql-jp: 37649] ODBC ADODB.Recordset で Null 値が、NULL文字列になってしまう

PostgreSQLの日本語版ODBCドライバに不具合があるようです。
該当の方はバグが修正されている最新バージョン(8.2.0201)を取得しましょう。
昨日、Windows版PostgreSQL を 8.1.5にバージョンアップしたところ、今まで動作していたアプリケーションが異常な動作をするので、原因を調査したところ、
ODBC ドライバーが、 8.01.0200 から、 8.02.0200 に上がると挙動が変わることが分かりました。
具体的には、VB6のADODB.Recordset で、VARCHAR 型に対して Null 値を書き込むと、 DB の Null 値で書き込まれていたものが、Null文字列で、書き込まれてしまう様になってしまいました。

まず第一にバグ自体はずっと存在していたもので8.2固有のものではありません。
ただし、このバグはNULL文字列を格納処理すれば必ず発症するというようなものではないため、発症するしないはかなり微妙です。たとえばODBC3.0以前の古いスタイルを踏襲しているアプリやミドルウェアでは発症しません。今回問題になっているADO使用の場合でも、他に非NULL項目を一緒に更新したりすると、ADOが処理方法を変えてしまうせいか発症しないようです。
ADO使用によるNULL文字列更新に関していえば、8.1.0200でテストした所発症はしませんでした。何かの要因があるAPIの発行を阻んでいるようでラッキーだったということでしょう。なお8.2.0201では大元のバグが修正されています。


いのっち父のページ
http://www.geocities.jp/inocchichichi/

本家 JP版 ODBCドライバ配布 FTPサイト(2006.11.17現在まだ反映されていません)
ftp://ftp.jp.postgresql.org/odbc/versions/

via [pgsql-jp: 37649] ODBC ADODB.Recordset で Null 値が、NULL文字列になってしまう

2006-11-14

Symbols.com

自分用メモ。記号を探していて見つけました。

西洋のシンボルの辞典サイト。
ギリシャ時代や古代のシンボルもあって面白い。

Symbols.com - Home

2006-11-09

script.aculo.us 1.6.5 was pushed

script.aculo.us 1.6.5 がリリースされました。

CHANGELOG は こちら

以下が注目点でしょうか。
  • ・Prototype が 1.5.0_rc1に

  • Builder で HTML「for」をサポート
    var node = Builder.node('label', { htmlFor: 'myinput' });

  • エフェクトにEffect.Eventが追加。連続したエフェクトの任意の箇所で発生させることが可能。
    new Effect.Event({ afterFinish:function(){
    // do some code here
    }, position: 'end' });
    positionは「front」「with-last」「end」が使用可能。


  • Builder.build()が追加。HTMLタグを含む文字列からノードを作成
    var node = Builder.build("<p>this is <b>neat!</b></p>");

  • Effect.Pulsate に pulses パラメータが追加。以下の例では、2回振動します。
    (デフォルトは5回)
    Effect.Pulsate('d8', {pulses: 2});

  • Ruby On Rails 1.2 では script.aculo.us 1.7 をリリースする予定なんだそうです。
    楽しみですね。


via script.aculo.us - downloads

2006-11-08

1時間に10分休憩

派遣社員の契約書の下のほうか裏に必ず書いてあるのが、「1時間作業毎に10分休憩」という文言だ。

でもこれがなかなか難しい。
興に乗っている場合も難しいし、そうでなくても「あ、もうこんなに時間が経っちゃった」とおもうことはしばしば。
集中力がないときは何度でも休憩に行くんだけどそれはそれでどうかしら...

1時間経ったら教えてくれるタイマー(Windows専用)
VDTタイマー

少しは老眼にストップがかかるかな...

viaスラッシュドット ジャパン | VDT作業者には「VDTタイマー」を

2006-11-05

携帯用 Gmail アプリ

Gmail for mobile client

Gmailから携帯アプリが出た模様。
うぉー使ってみてぇ。
しかし、京ぽんでアプリは使えない...orz
皆様レポ宜しくお願い致します。

アプリはココからダウンロードできます
http://gmail.com/app

[必要動作環境]
  • Gmailの設定で言語を English (US) にしておくこと
  • J2ME (Java) MIDP2をサポートしていること(コレが敷居が高いらしい)
  • ベリサインのClass3認証をサポートしていること(シリアルNo 70:BA:E4:1D:10:D9:29:34:B6:38:CA:7B:03:CC:BA:BF)

動作確認機種はこちら。
Which devices work with the Gmail for mobile application?

ヘルプはこちら
Gmail for mobile application - Help
※右上のドロップダウンリストで言語を英語にすれば表示できます。

Thanks Team stalwarts !

via Official Google Blog: Gmail mobile client is live