HHeLiBeXの日記 正道編

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

DB2

identity column定義を削除する

DB2

大昔に、DB2でidentity columnを定義するという記事を書いた。 hhelibex.hatenablog.jp これを使って生成したテーブルがあるのだが、とある事情により、自動採番ではない形に変更する必要が生じた。 うーん‥どうやって削除するんだ、これ?‥と悩み探して20分…

DB2のトランザクションログ領域が足りない場合の対処

プライベートでデータを蓄積しているDB2サーバーで、巨大なインデックスを作ろうとしたら、トランザクションログがいっぱいというエラーが発生しました。 db2inst1@ubuntu14.04:~$ db2 "CREATE INDEX idx_hoge_hogehoge ON hoge(hogehoge)" DB21034E The com…

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

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 に更新しなきゃならないことを思い出したらしいが、それはまた後で) とりあえず、ア…