読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

自動採番の列が存在するテーブルへのデータロード

DB2

バックアップからのリストアではなく、あるDBサーバーからデータをエクスポートして、別のDBサーバーでインポートするという場合に、邪魔になってくるのが自動採番するように定義した列の存在。 DB2で言えば「GENERATED ALWAYS AS IDENTITY」が列定義に付い…

SQLExceptionから取得できるSQLSTATEとエラーコード

ふとjava.sql.SQLExceptionのJavaDocを見ていたら、SQLSTATEとベンダー固有のエラーコードを取得できることに(いまさら)気づいた。 ベンダー固有のエラーコードはログに吐き出すくらいしか用途を思いつかないが、SQLSTATEはある程度規格化されているはずなの…

CURRENT_TIMESTAMPの精度

DB2

ふと気づいた、どうでもいいような面白いこと。 これまで、Windows環境でのDB2使用経験が全体の大半を占める自分は、DB2のCURRENT_TIMESTAMPの精度はミリ秒単位までだと思っていた。しかし、最近、Ubuntu上にインストールしたDB2ではどうも様子が違う。 とい…

LIMITの限界に挑戦

以下のエントリで、各構文のサポート状況について書いた。 指定した範囲の行を取得するクエリ - HHeLiBeXの日記 正道編 この中のLIMIT/OFFSETで不思議な挙動を示したものがあったり、どこまでいけるんだろうと思ったりしたので、調子に乗って(謎)、LIMITに指…

指定した範囲の行を取得するクエリ

DB2 Express-C v9.7.2のWindows版で使えていたLIMIT/OFFSETが同Linux版で使えなくて、プラットフォームによって違うのかと思ってしまい、同等のことができる構文をいろいろと調べた挙句、インストール直後の設定が違っていただけという。 で、せっかくなので…

DB2 Express-C v9.7をUbuntu 10.04 Serverにインストール

DBサーバー用に作ったUbuntu 10.04 Server on Ubuntu 10.04 Server(何)へのインストール。 最初、何も考えずにDB2 Express-C v9.7.4のLinux用アーカイブをダウンロードして、展開して、READMEとかその辺を読みながら以下のコマンドを実行。 $ sudo apt-get i…

文字列型とマルチバイト文字

MySQLで、何も考えずに「VARCHAR(n)」な列に日本語n文字を格納しようとしたら格納できてしまい、DB2での記憶と違うということで一通り調べてみたらしい。作ったテーブルは次のとおり。 CREATE TABLE tbl1(str CHAR(6) NOT NULL) CREATE TABLE tbl2(str NCHAR…

テーブル名や列名の別名の指定

はじめに - SQL標準規格では SQL標準規格によると、SQL文ではテーブル名や列名の別名を次のように指定することができることになっている。(いずれも、キーワード AS は省略可能) SELECT t.col2 [AS] c2 FROM tbl [AS] t WHERE t.col1 = 1 UPDATE tbl [AS] t …

プロシジャの出力パラメータの値をSQLだけを使って確認する

例えば、DB2で次のようなプロシジャを作ったとする。('!'は、「db2 -td! -f hoge.sql」と実行するための区切り文字) -- 配列型はCREATE TYPEしないと使えない CREATE TYPE CHARACTER_VARYING_255_ARRAY AS CHARACTER VARYING(255) ARRAY[255] ! -- テスト対…

CURRENT_TIMESTAMPをTIMESTAMP型の列のデフォルト値に指定してみる

一見するとなんてことはない。 つまりは次のようなテーブル定義をするということ。 CREATE TABLE xxx( id INT NOT NULL , ts1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , ts2 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) 2つのタイムスタンプを必…

SQLクエリメモ - 整数型カラム中の欠番を見つけるクエリ

とあるプログラム(何)で、未処理のID(=欠番)を見つけ出して処理を実行するという必要性が生じたので、欠番を見つけ出すためのSQLクエリを作ってみた。(プログラムでループ回して1つずつチェックなんて、数万件のデータに対してはやってられないから) プログ…

キャストを使うなら覚悟を持って

どのような言語にも、機能的には便利だが使いどころを誤ると大変なことになるというものが(恐らく)存在する。 何らかの数値を表すデータを、RDBに文字列で格納して検索時にキャストして比較するという、嘘のような本当の話があるらしい。詳しい状況は分から…

文字列の連結

SQLにおける文字列連結は「縦棒2本(||)」という自分の中の常識が打ち破られたらしい。 ということで、次のテーブルを前提として調査してみた。 CREATE TABLE hoge( v1 VARCHAR(4) NOT NULL , v2 VARCHAR(4) NOT NULL , v3 VARCHAR(4) NOT NULL , v4 VARCHAR(…

DB2接続設定 - PHP実行環境改変メモ(3)

引き続き、自宅のPCのPHP環境の改変。 PHP実行環境構築メモ - HHeLiBeXの日記 正道編 PHP実行環境改変メモ - HHeLiBeXの日記 正道編 MySQL接続設定 - PHP実行環境改変メモ(2) - HHeLiBeXの日記 正道編 ためしにDB2に接続してみる 以前に、PHPのWindows版バイ…

列名を持たない列の列名(意味不明)

なんと言えばいいのか分からなかったので意味不明なタイトルになったが、要は次のようなクエリを実行したときの結果表の列名はどうなるのか、ということ。 SELECT COUNT(*) FROM hoge ということで、一通り調べてみた。 次のテーブルを前提とする。 CREATE T…

各DBMSで日付型の値から曜日を取り出す

最初、PostgreSQLでdate_part関数を使用している処理があって、それをMySQLではどう書けばいいかというのを調べたことから始まったのだが。 手始めに次のブログを見つけた。 馬場誠Blog(東京都世田谷区経堂のWebクリエイター)» ブログアーカイブ » MySQLで…

ISBNをチェックするユーティリティ

唐突に、いつかどこかで役に立つかなぁ、と思い、持てる力(何)をいろいろ出してユーティリティを書いてみた。 アルゴリズムはWikipedia(ISBN - Wikipedia)を参考にした。 Java版 多少のブランクはあってもやはり私のプライマリ言語ということでまず最初に。 …

表関数 - 戻り値として表を返す

SQL2003から、表関数というものが追加された(と本には書いてある(ということにしておく(謎)))。SQL2003ハンドブック―SQL最新標準規格作者: 土田正士,小寺孝出版社/メーカー: ソフトリサーチセンター発売日: 2004/12メディア: 単行本 クリック: 1回この商品を…

SQLクエリメモ - XMLデータをリレーショナルデータに変換するクエリ

ふとしたこと(何)から、次のような構造を持つXMLデータが格納されたテーブルから、リレーショナルな構造を持つ別のテーブルへkey-valueの組をコピーするクエリを書いた。 <path> <to key="k1" val="v1"/> <to key="k2" val="v2"/> </path> いわゆる繰り返し構造になっているのが今回のポイント。 テーブルの構造は次のよ…

identity column - テーブルの各行にシーケンス番号を割り当てる

ある理由から、シーケンス番号をテーブルの各行に割り当てる必要があり、シーケンスジェネレータを明示的に生成(CREATE SEQUENCE)して、テーブルへの行挿入時にトリガーを使ってシーケンス番号を割り当てるというSQLコードを書いた。 そのコードに対する意見…

テーブルの制約の規定に使用されている列の取得

ある制約を規定するのに使用されている列を取得するには、KEY_COLUMN_USAGEというビューを使用することができる。 PostgreSQL v8.4で次のようなクエリを発行する: SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'public' ORDER …

テーブルの制約一覧の取得

おもむろに次のようなテーブルを作ってみる。 CREATE TABLE hoge( col1 INT NOT NULL , col2 INT NOT NULL , CONSTRAINT pkey_hoge PRIMARY KEY(col1, col2) ) ; CREATE TABLE foo( col1 INT NOT NULL , col2 INT NOT NULL , col3 INT NOT NULL , col4 INT N…

WAS CEでDB2を使う

WAS CE(中身はGeronimo)で、DB2をデータソースとして登録して使用するアプリを作ろうとしたら、データソースを作成して参照できるようにするまでにえらい苦労したので、手順をメモ。 環境 WAS CE v2.1.1.3 DB2 Express-C v9.1.2 データソースの作成 WAS CEの…

XMLデータのスキーマ設計は計画的に

「扱うデータをXMLにしておくと冗長性がなんたらかんたら‥」、「とりあえず全部放り込んでおいて、必要な部分を問い合わせ時に取り出すようにすればうんたらかんたら‥」。 まぁ、ある意味妥当な意見ではあるのだけど、それで問題がないという裏づけはきちん…

TIMESTAMP のリテラル

TIMESTAMP のリテラルを記述する際に、DB2 で苦労した記憶が唐突によみがえってきたので、手元にある DBMS を比べてみた。 IBM DB2 Express-C v9.1.2 IBM DB2 Express-C v9.5.2 IBM DB2 Express-C v9.7.0 Oracle Database 10g Express Edition PostgreSQL v8…

情報スキーマ-列名の取得

以下のエントリで、識別子の大文字/小文字について触れた。 識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編 で、列名の情報がどう格納されているのかについてまとめてみる。 実行してみるクエリは、各DBMSについて以下のようなものになる。 表の生成…

識別子の大文字と小文字の違い

時々、CREATE TABLE文を書くときには CREATE TABLE "HOGE"("ID" INTEGER, "NAME" VARCHAR(8)) のように書くのに、INSERT文では INSERT INTO HOGE(ID, NAME) VALUES(12345678, 'hhelibex') のように書いている、というケースを見かける。 確かに、SQLでは、テ…

ユーザ定義型(構造型)の値をJDBCで扱ってみる

せっかくSQLにユーザ定義型(構造型)を定義する機能があるので(謎)、JDBC経由で参照、更新をしてみる。 使用する環境は以下のとおり。 DB2 Express-C v9.7.0 (と書いて FP1 に更新しなきゃならないことを思い出したらしいが、それはまた後で) とりあえず、ア…

SQLの比較演算子

唐突に、「プログラム言語を学んだ後でSQLを学ぶと、"not equal"を"!="と書きたくなる人が多いんじゃないか」、「SQLでは"<>"」と考えたところで、どこかの実装で"!="が使えたものがあったような記憶がよみがえってきた。 そこで、次の本を参照してみた。SQL…

java.sql.Array を使ってみる

DB2 v9.5 から ARRAY 型がサポートされるようになった。ただし、自分が認識している範囲では次の制限がある。 プロシジャ(Procedure)のパラメータでのみ指定できる。 (DB2 v9.7以降)関数(Function)のパラメータか戻り値にも指定できる。(とオンラインマニュ…

型付表の定義

DB2 で型付表を作ろうとするときに必要な手順を、いつもいつも忘れるのでメモ。 まぁ、DB2のオンラインマニュアルには書いてあるんだけど‥探すといつも見つからない‥(ちなみに、キーワード「CREATE SEQUENCE」で探すと何番目かに出てくる。) CREATE TYPE "TY…

悩みがちなLOBデータの挿入手順メモ

JDBCで表にデータを格納するとき、INT型とかVARCHAR型とかなら自信を持って「こうやるんだ」と言えるんだけど、LOBデータ(CLOB、BLOB、XML)となると途端に「え、えと‥」となってしまう自分がいる。単なるcharacter stream、byte streamなんだけどね。 そんな…

外部結合とある条件を満たす副照会の合わせ技で発現するバグ

DB2

DB2 9.1/9.5/9.7の特定バージョンで、間違った結果が返るバグ | Unofficial DB2 BLOG IBM リダイレクト用ページ - Japan 対象バージョンが「DB2 for LUW V9.1 FP(Fix Pack)7/FP7a/FP8, V9.5 FP4/FP4a, V9.7 GA」ということで、手元にあるバージョン DB2 Expr…

SQLクエリメモ - 表定義の情報を出力するクエリ

DB2

DB2のコントロール・センターで表を選択したときに下に表示される表定義の情報(+外部キーの情報)を得るためのクエリ。 テキストとして得られればいろいろと使えるので。 SELECT CASE WHEN P.TABLE_SCHEM IS NOT NULL AND P.TABLE_NAME IS NOT NULL AND P.CO…

コマンドメモ - ログの出力先などを表示する

Windows 環境で稼動する DB2 のログファイルに関する情報を得るためのコマンドメモ。UNIX/Linux だったら grep を使うところ。 db2 GET DB CFG FOR データベース名 | FINDSTR "ログ・ファイルのパス 最初のアクティブ・ログ・ファイル LOGPRIMARY LOGSECOND"…

Re:XMLEXISTSを使う場合の注意点(だと思う)

XMLEXISTSを使う場合の注意点(だと思う) - HHeLiBeXの日記 正道編 一応、記録のため(何)に、実験を再現するためのクエリとかを残しておく。(普段はそうするんだけど、なぜか今回はすっかり忘れていた‥) まずはデータ。そのまんま載せるととんでもないことに…

XMLEXISTSを使う場合の注意点(だと思う)

発端 2年近く前に、次のようなクエリが原因でアプリケーションのレスポンスが悪いという状況に出くわした。 xquery count( for $doc in db2-fn:sqlquery(" select xmlquery('for $doc in $root/hoge return $doc' passing DOCUMENT.DATA as ""root"") from D…

XMLTABLE関数の謎な挙動

DB2

やっていることはものすごくシンプル。 CREATE DATABASE HOGE USING CODESET UTF-8 TERRITORY JP COLLATE USING SYSTEM PAGESIZE 32 K ; CONNECT TO HOGE USER db2admin USING admin ; CREATE TABLE DOCUMENT ( ID VARCHAR(8) NOT NULL, DATA XML NOT NULL, …

パラメータマーカーに指定する文字列が長すぎるとSQLエラー(続き)

パラメータマーカーに指定する文字列が長すぎるとSQLエラー - HHeLiBeXの日記 正道編 これを受けて、「じゃあどうするべきなのか」という話を書こうとしたんだけど、眠くて力尽きたというか(ごにょごにょ)。 DB2はPREPAREする時点でパラメーターマーカーの型…

DB2 Express-C 9.7の導入

DB2

無料のDB2 Express-C 9.7 リリース&Django対応アダプタリリース!ということで、早速ダウンロードしてインストール。 ひとつ忘れちゃいけないのは、DB2 v9.1/v9.5/v9.7の混在環境になるため、「DB2 インスタンスの構成」でポート番号を変更すること。ちょっ…

XMLデータを格納する表の定義

OracleでXMLデータを格納する表を作成する場合のSQL文。比較のためにDB2のものも。 とりあえず、Epictetusというツールで流したクエリ。Oracle CREATE TABLE HOGE(ID INTEGER, DATA XMLType) ; INSERT INTO HOGE(ID, DATA) VALUES(1, '<root>hoge</root>') ; SELECT * FRO…

パラメータマーカーに指定する文字列が長すぎるとSQLエラー

以下のような表を作成する。 CREATE TABLE HOGE(ID SMALLINT, NAME VARCHAR(10)) ポイントは「VARCHAR(10)」。 で、JDBCを使って以下のようなクエリを発行してみる。 SELECT ID, NAME FROM HOGE WHERE NAME = '0123456789a' INSERT INTO HOGE(ID, NAME) VALU…

Text Searchインデックスの削除を忘れてしまった場合の対処

DB2

DB2 v9.5のText SearchもNSEと同様にテキスト検索用インデックスを管理するためのものだが、やはりNSEと同様に、テキストインデックスをDROPする前にテーブルやデータベースをDROPしてしまうと、自動更新スケジュールの定義だけが残りひどい目にあう。 で、…

IMPORTとLOADとcodepageの指定

DB2

データをデータベースにインポート/ロードする際には、コードページの指定は当然だと思っているが、コードページを指定していないスクリプトファイルに出くわしたことがきっかけで、ちょっと調べてみようと思った。 ちなみに、DB2 v9.5からLOADコマンドでXML…

幻のsun.io.MalformedInputException

SunのJava VM(j2sdk1.4.2_18、jdk1.5.0_11、jdk1.6.0_01で確認)で、以下の処理を実行させると、エラーが発生することなく終了する。(もちろん、いわゆる文字化け状態になるが‥) byte[] b_Shift_JIS = { (byte) 0x8b, (byte) 0x43, // き (byte) 0x82, (byte)…

DB2 Express-C v9.5.2のインストール

以下のブログエントリに、DB2 Express-C v9.5.2に関することが記述されていて、唐突に「そういえば、ベータ版が出たのを確認してから後にチェックしてなかった」ということを思い出す。 DB2 for Windows クイックインストールを更新しました | Unofficial DB…

JDBCでのXML型データの取得

DB2のXML型のデータをJDBCで取得する方法を探ってみる。 JDK 5.0 (JDBC 3.0)の場合 まず、getObjectして、実装されているインタフェースを調べてみる。 String queryStr = "SELECT XMLDOCUMENT(XMLELEMENT(NAME \"res\", T.VAL)) AS DATA FROM TABLE(VALUES(…

コマンド・ウィンドウ(管理者)の起動用ショートカット

DB2

状況: Windows Vista環境で、UACが有効になっている。 DB2のv9.1とv9.5(共にExpress-C)が混在している。 管理者として実行しないと、コマンド・ウィンドウ他が機能しない。 DB2 v9.5のBINなどがシステムの環境変数PATHに含まれている。 で、v9.5には「コマ…

NSEインデックスの削除を忘れてしまった場合の対処

DB2

DB2のNSE(Net Search Extender)は、テキスト検索用インデックスを管理するためのものだが、DB2のインスタンスとは別サービスのため、DB内のデータを更新した際にテキストインデックスは即時更新されなかったりするし、テキストインデックスを削除する前にテ…

トランザクション内でユニークなTIMESTAMP値を取得する試みの実践

「トランザクション内でユニークなTIMESTAMP値を取得する試み」をDB2 v9.5で実践してみる。 その際の考慮点は以下のとおり。 GLOBAL TEMPORARY TABLEを作成するにはUSER TEMPORARY TABLESPACEが必要。 GLOBAL TEMPORARY TABLEは必ず"SESSION"スキーマに作成…