DB

2009.12.11

新標準PostgreSQL

入門書というだけあり、データベースそのものの基礎やSQLの文法等に関しても軽く触れられています。ただ、それだけではなく、PostgreSQLを実際に運用する場合によく行われるであろう設定や、状態のチェックなどに関しても触れられており、

・これからPostgreSQLを使った開発を行う
・とりあえずPostgreSQLを使ったシステムの開発を行っている
・とりあえずPostgreSQLを使ったシステムの運用を行っている

といった人にもいい感じではないでしょうか。

ある程度、アプリケーションを作ったことのある人ならサンプルソースなどははっきり言って不要ですが、運用・管理面の部分だけでもそれなりに役に立つのではないかと思います。

| | Comments (0) | TrackBack (0)

2009.03.02

Windows上のSQLiteで.importを行う

 SQLiteに格納するデータは基本的にUTF-8となります(少なくとも、SQLite Java Wrapper/JDBC Driverでアクセスした場合、自動的にUTF-8となります)。

 WindowsのコマンドプロンプトはデフォルトはMS932なので、sqlite3.exeでテキストファイルを読み込むとき、どうやってUTF-8でimportするか・・・と悩んでいたのですが、実は、テキストファイルをUTF-8で保存しておくだけでOKなんですね。

 UTF-8で保存したテキストを .import した場合、コマンドプロンプトのエンコードに関係なく、テキストファイル内の文字コードとして取り込んでくれるようです(なので、chcp 65001 等の作業をすることなく、UTF-8で取り込むことが可能)。

 もちろん、その状態だと、コマンドプロンプトからsqlite3.exeで対話型でSQLを実行したときにはまりますが(^^;

#SQLite用のGUIフロントエンドは、基本的にUTF-8で処理をするようなので、UTF-8で取り込んでおいた方が何かと都合がいいかと。

| | Comments (0) | TrackBack (0)

2009.02.21

DB2の自動インストール

応答ファイルのキーワード(DB2 9.5)

応答ファイルを用いてインストールする場合、

setup.exe /m /u (応答ファイルのパス)

のような感じで実行。

もっとも、実際にはいきなり応答ファイルを作成するのではなく、setup.exeを通常(GUIモード)起動し、そこで応答ファイルを保存したものをベースに編集した方が楽だと思われます(ちょっとした修正をテキストエディタで行うような感じでしょうか)。

| | Comments (0) | TrackBack (0)

2009.02.15

byteaデータの書き込み

 PostgreSQLでbytea型のデータを書き込む処理のメモ。

1.PreparedStatementでSQLを構築する。
2.PreparedStatement#setBinaryStream(int, InputStream, int)でデータをセットする。なお、書き込むデータが既にbyte[]になっている場合は、setBytes(byte[])でも可(わざわざByteArrayInputStream()を作成しなくてもOK)。

 注意点としては、setBinaryStream(int, InputStream)や、setBinaryStream(int, InputStream, long)の場合は、is not yet implemented. ということでエラーになってしまうようです(postgresql-8.3-604.jdbc4のドライバで検証)。

 なお、bytea型のデータを読み込む場合は、ResultSet#getBinaryStream(int)を使用するか、あるいはbyte[]の状態のまま次の処理を行うのであればResultSet#getBytes(int)で取得してもOKのようです。

| | Comments (0) | TrackBack (0)

2009.02.11

copyでNULL値の読込

 PostgreSQLのCOPY を使うと、大量のデータを(SQLで処理する場合と比較し)高速に読み込ませることができます。

 ドキュメントによると、NULL値も取り込めるとのことですが、いくらやっても失敗してしまう・・・。と思ったら、何のことはない、テキスト中のNULL値が、\N(NULL値)ではなく\n(改行コード)になっていたことが原因でした・・・。

#ちなみに、psqlのセッションにおいて、

\pset null *NULL*

のような感じのコマンドを投げる(「*NULL*」の部分は表示させたい任意の文字列)と、selectした結果のNULL値の出力を切り替えることができます。

| | Comments (0) | TrackBack (0)

2009.02.08

JOTMを用いてTwo Phase Commit

 久しぶりにTwo Phase Commitが必要となるアプリケーションの開発を行うことに。前回の開発時はIBM WebSphere Appication Serverの環境下だったので、普通に(?)lookupで処理を行うことができました。しかしながら、今回はJavaアプリケーションにおいてもTwo Phase Commitが必要になってくるので、J2EEコンテナが必要というような方法は使用できず。

 S2JTAという選択肢も考えたのですが、諸事情により今回は見送り(S2JTAは「Java EEアプリケーション・サーバーに依存しない実装」も提供されているとのことですが、これはスタンドアローンアプリでも使用できるってことなんでしょうかね??)。

 Samples for Connection Pooling and Distributed TransactionsXA with Two-Phase Commit Operation--XA4.javaのような感じで、XAResourceなどを使用して自前で処理を記述するという方法もありますが、ソースの記述量が若干増えてしまうのが難点。

Continue reading "JOTMを用いてTwo Phase Commit"

| | Comments (0) | TrackBack (0)

2009.01.30

PostgreSQL JDBCドライバの各バージョン

 配布されているソースコードは1種類ですが、バイナリダウンロードの場合はJDKのバージョンにあわせて選択するPostgreSQLのJDBCドライバ。その実体はどの程度違うんだろう・・・と思っていたのですが、たまたまJDBCドライバのソースを眺める機会があったので解決。

 Antでビルドする際のオプションにより、最終的にどのドライバを利用するClassファイル群ができあがるかが異なってきているようです(ビルドする際に、ソースコード(の元となるもの)内のテキストの置換を行っています)。

#単純にソースファイル一式をEclipseに取り込んだだけではコンパイルエラー出まくり(^^; 

| | Comments (0) | TrackBack (0)

2009.01.29

PostgreSQLでdblink

 dblink・・・接続中のデータベースから、別のデータベースに接続するための関数。分散されているデータを結合して検索したりするときに有用?

 参考:PostgreSQLのdblink(database link)

 まずはdblink関数のインストール。openSUSE11.1でYaSTでpostgresql-contribパッケージをインストールしている場合、必要なSQLファイルが既にコピーされているので、psqlでそれを実行すればOK。

# psql -U postgres -d testdb < /usr/share/postgresql/contrib/dblink.sql

 なお、アンインストール用のSQLファイルも存在します(ひたすらDROPしていきます)。

# psql -U postgres -d testdb < /usr/share/postgresql/contrib/uninstall_dblink.sql

select文を発行する場合、

select dblink_connect('conn1',
'hostaddr=192.168.99.203 port=5432 dbname=testdb user=pguser password=pguser');

でリモートデータベースに接続し、
select * from dblink('conn1', 'select col1,col2,col3 from schema1.table1')
t1(col1 integer, col2 character(10), col3 timestamp);

でSELECT文実行。取得対象となるカラム名を全部定義する必要があるので、少し面倒かも・・・。

 ちなみに、コネクションを切断する場合は、

select dblink_disconnect('conn1');

のような感じです。

 とりあえず試しては見たものの、実際に(僕が)使う機会は出てくるんだろうか・・・(^^;

| | Comments (0) | TrackBack (0)

2009.01.24

PL/pgSQLでupdate件数を取得する

PostgreSQLのストアド関数でPL/pgSQLを使ってみる練習。まずは、PL/pgSQLを使えるかどうかの確認。

psql -U username -d testdb -c "select * from pg_language;"

で、インストールされている言語の一覧を取得できます。
 lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl
----------+----------+---------+--------------+---------------+--------------+--------
 internal |       10 | f       | f            |             0 |         2246 |
 c        |       10 | f       | f            |             0 |         2247 |
 sql      |       10 | f       | t            |             0 |         2248 |
(3 rows)

ってことで、インストールされていないようなので、
createlang -h 127.0.0.1 -d testdb -U username plpgsql

で実際に使用するデータベースに対してPL/pgSQLをインストール(参考:PostgreSQL 編19 - ストアドファンクション、function、PL/pgSQL、トリガー)。

Continue reading "PL/pgSQLでupdate件数を取得する"

| | Comments (0) | TrackBack (0)

2009.01.23

PostgreSQLでカレントスキーマを設定

 PostgreSQLにおいては、通常はpublicスキーマがカレントとなり、スキーマを指定しない場合はpublicに対してアクセスされます(もちろん、明示的に指定することも可能)。

 カレントスキーマの情報を取得する場合は、

select current_schema();

を実行すればOK。上記のような場合はpublicが結果として得られます。ちなみに、
select current_schemas(true);

の場合、暗黙的に検索されるパス(pg_catalog)も得られます(引数がfalseの場合は、暗黙的に検索されるパスは表示されません)。

 逆にカレントスキーマを設定する場合は、

set search_path to schema1;

でOK。設定は上書きされますので、publicは検索対象から外れることとなります。
set search_path to schema1, schema2;

のように複数指定することも可能です。なお、複数指定している場合、current_schema()の戻り値は先頭のスキーマとなります。

| | Comments (0) | TrackBack (0)