<< AIXにDB2を導入する場合にチェックすべき情報が更新 | main | DB2 9.7のマニュアルが公開 >>

DB2はPREPAREする時点でパラメーターマーカーの型を評価している

hhelibexさんのblogエントリより:
- パラメータマーカーに指定する文字列が長すぎるとSQLエラー - 気まぐれ日記
Oracle、PostgreSQL、MySQLではSELECTとDELETEは正常終了するのに、DB2は、SELECTとDELETEでもエラーになる。

上記はhhelibexさんがDB2のPREPAREの動きで疑問を感じているという内容です。詳しくは上のエントリを読んでいただくとして疑問を簡単に説明すると、"CREATE TABLE HOGE(ID SMALLINT, NAME VARCHAR(10))"と定義したNAME列に対して

> SELECT ID, NAME FROM HOGE WHERE NAME = '0123456789a' (※リテラル文字列が11バイトある)

だとエラーなく動くのに、

> SELECT ID, NAME FROM HOGE WHERE NAME = ?

としておいて、PREPAREでパラメーターマーカー(?のところ)に11バイト以上の長さの文字列を当てはめようとするとSQL-302エラーが返ってくるというわけです。(DB2以外のRDBMSだとエラー無く動く場合が多いようです)

これはDB2の仕様通りの動きです。エラー(SQL-302)の意味は

> SQL0302N EXECUTE または OPEN ステートメント内のホスト変数の値が大きすぎます。

である事から分かるようにパラメーターマーカー(ここではホスト変数と書かれていますが)のサイズ(型)をチェックしている事からくるエラーなのです。つまりDB2はPREPAREでパラメーターマーカーに値を入れる際にパラメーターマーカーの型と、値(リテラル)に互換性があるかをチェックしています。

パラメーターマーカーに型があるのかと思われるかもしれませんが、DB2はNULLであれパラメーターマーカーであれ、型が存在します(型を評価しようとします)。この場合は"WHERE NAME = ?"ですからNAME型のVARCHAR(10)が?の型と類推されます。?がVARCHAR(10)なのにPREPAREで11バイトの文字列を当てはめようとするので、そこでエラーが出ているわけです。

これをエラー無く動作させたい場合は?に11バイト以上入る型を与えれば良いわけです。SQLで型を指定するにはCASTを使用します。つまりPREPAREの時点で

> SELECT ID, NAME FROM HOGE WHERE NAME = CAST(? AS VARCHAR(100))

等とするとエラー無く動作します。お試しあれ。(一応手元の環境でで小さいプログラムを組んで試しましたので、大丈夫だと思います。)

このように、DB2の型に関する厳密さは他のRDBMSとDB2とで共通コードを書こうとした時に、注意しなくてはいけない点の一つです。NULLの扱いに関しては以下に書いています。

- DB2小ネタ - DB2ではNULLをSELECTに単純には置けない

こういった型への厳密さは他RDBMSからの移植の妨げになり得たのですが、DB2 9.7では"緩い型付け"モードが追加されて上記のような他RDBMSとの非互換が起こりにくくなっています。(DB2 9.7で上記がCAST無しで通るのかは確認できていないです)

タイムリーなことに日付が変わって19日になりました:) 今日がDB2 9.7の出荷開始日です!

コメント
コメントする(emailやurlは無記入でもOKです)









この記事のトラックバックURL (※SPAM対策のため、元記事のPermalink URLへのリンクがないものはトラックバックされません)
トラックバック
search my sites.
try! DB2
DB2 Express-C ダウンロード
DB2 Express-Cは無料で使用できます。使用期限やDBサイズ制限もありません。
links
ad
about this site
recommend
DB2 9.7 エバリュエーション・ガイドブック
DB2 9.7 エバリュエーション・ガイドブック (JUGEMレビュー »)
日本アイ・ビー・エム
DB2 9の全体像と9.7の新機能を余すことなく解説した入門者向けガイド本です。(レビューはこちら)
recommend
Effective Java 第2版 (The Java Series)
Effective Java 第2版 (The Java Series) (JUGEMレビュー »)
Joshua Bloch
すべてのJava開発者必読の書が大幅改訂されて第2版になりました!。
文法などは解説していませんが、Java言語でプログラムを書くにはどういう事に気をつけるべきかという事が非常に端的に、かつ明確な理由とともに解説されています。
第2版ではJava SE 6対応がなされ、第1版で提案してJava SEに取り込まれた部分は整理され、新しい機能であるGenericsやアノテーションについての記述が多数追加されています。以前に増してお勧めできる書になりました。
まだ読んだことが無いJava開発者はぜひ読んでみてください。
recommend
達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
達人に学ぶ SQL徹底指南書 (CodeZine BOOKS) (JUGEMレビュー »)
ミック
基礎的なSQLは書けるようになったけど、今ひとつSQLのルールになんとなくしっくりこない、腑に落ちない。そんな人にお勧めの入門書です。SQLの根底に流れる基本的な考え方をやさしく解説してくれています。(レビューはこちら)
recommend
SQLパズル 第2版 プログラミングが変わる書き方/考え方
SQLパズル 第2版 プログラミングが変わる書き方/考え方 (JUGEMレビュー »)
ジョー・セルコ,Joe Celko
SQL入門を終えて、SQL中級/上級者になりたいと考えている方にぴったりのトレーニング本です(レビューはこちら)
recommend
XML-DB開発 実技コース
XML-DB開発 実技コース (JUGEMレビュー »)
下佐粉 昭,野間 愛一郎,久保 俊彦,高橋 賢司
XML-DBのやさしい入門書です。XMLの基礎から、XPath,XQueryの解説、設計の基礎、Javaでのプログラミング等盛りだくさんの内容です。
recommend
プロジェクトの流れで理解するXMLDBデザイン徹底解説―最新DB2 9.5pure XML対応
プロジェクトの流れで理解するXMLDBデザイン徹底解説―最新DB2 9.5pure XML対応 (JUGEMレビュー »)
日本アイ・ビー・エム
XML-DBの実践的なデザイン方法を解説した初めてのガイドです。XML-DBを使った開発に興味のある人やプロジェクトでXML-DBを使用する予定の人にお勧めです。
recommend
データベースパフォーマンスアップの教科書 基本原理編
データベースパフォーマンスアップの教科書 基本原理編 (JUGEMレビュー »)
エンコアコンサルティング
DBMSの基本的な内部構成、動作についての考え方をやさしく解説してくれています。(レビューはこちら)
recommend
メインフレーム実践ハンドブック z/OS(MVS),MSP,VOS3のしくみと使い方
メインフレーム実践ハンドブック z/OS(MVS),MSP,VOS3のしくみと使い方 (JUGEMレビュー »)
神居 俊哉
メインフレームの技術について、基礎概念から、実践的な使い方までを網羅した初めての解説書です。
recommend
セオリー・オブ・スタイルシート (Quick Master of Web Technique)
セオリー・オブ・スタイルシート (Quick Master of Web Technique) (JUGEMレビュー »)

CSSの概念/基礎をしっかりと解説してくれるCSS入門書。サイトへの実践的な適用方法も解説されています(レビューはこちら)
携帯からアクセス
バーコード
powerd by
ペパボのブログサービス【JUGEM
recent entries
categories
recent comments
recent trackbacks
archives