argius note

プログラミング関連

database

PostgreSQLでbigintのid列を後付けでbigserialに変換する方法

短い記事です。PostgreSQLのバージョンは、9.4.5です。create as select ...でテーブルを作ったら、bigserialにすべきidがbigintのままになっていて、アプリがコケていたというお粗末な話。 後からbigserialにできるのかどうか知らなかったので、とりあえずa…

人工キー(主キー自動生成)について、おさらい

主キー(プライマリキー)を自動生成する方法について、おさらいしてみました。

OracleJDBCのsetObjectでDATE型にjava.sql.Timestampを設定

そういえば、以前のエントリで11gではmapDateToTimestampというプロパティがデフォルトtrueで、DATE型の列がTimestampで取得できるという話がありました。 これは実際に11gで確認できました。すなわち、DATE型の列において、getObjectでjava.sql.Timestampが…

ファイルシステムをDBに見立ててJDBC経由SQLで検索

かなり以前から考えてはいたものの、なんやかんやでつまづいてお蔵入りしていたのを、先日また思い出して、ちょっとやってみたらJDBC接続とSQLエンジンは思いのほか簡単にプロトタイプができたのでメモっておきます。こんな風に SELECT * FROM FS WHERE ROOT…

DB2 Express-C for MacOS X をインストール (2)

前回(2011-02-28)から随分間が開いてしまいました。 停電の影響で再起動は済んでいたものの、忙しかったり他の問題があったりで手付かずに。ふと下書きを見ると、この記事の書きかけがあったので、やっと思い出したのでした。 インスタンス起動(続き) まず前…

DB2 Express-C for MacOS X をインストール (1)

OracleXEは止めて、未だに使ったことすらないDB2を試した方がいいんじゃないかと思ったので、ちょっと調べてみました。 こちらもExpress版があり、さらにbetaながらもMacOSXバージョンがあります。 v9.5.2 (db2exc_952beta_MAC_x86_64.tar.gz) インストール…

Oracle 行情報を扱う擬似列(ROW,ROWNUM)

行についての情報を扱う擬似列についてのメモです。 ROWID ROWNUMとROW_NUMBER() 擬似列と*を併用するには Oracleに限ったことではありませんが、DBMSにはメタデータ的な情報を列として扱うための仕掛けがあります。これを「擬似列」といいます。 例えば、"R…

Oracle SQL*Loaderで関数と自動採番を使う

SQL*Loaderでデータをロードする際に、これまではCSV形式などをそのままロードする使い方だけでやっていました。加工が必要な場合は、Perlなどで加工した後でロードしていました。でも、これだと無駄な1過程があるので、加工しながら直接ロードできるのでは…

Firefox3の履歴などの情報を抽出

パソコンを複数台使っていると、Webの履歴が分散してしまいます。ブックマークとかしておけば良さそうですが、見たときはあまり重要じゃないと思って後でやっぱり...みたいなことが、今までほんの偶にありました。 それならブラウザを介さずに履歴を見るため…

PostgreSQL8,MySQL5のダンプ

全ダンプだけ。 # PostgreSQL 8.3 /opt/local/lib/postgresql83/bin/pg_dumpall -U postgres > postgre.dmp # MySQL 5.1 /opt/local/bin/mysqldump5 --user=root --password=XXXXXX --all-databases > mysql.dmp

Oracle 文字列リテラルの代替引用符

10gからは、代替引用符が使えるようになったようです。Perl使いの人には判りやすいですね。外側の ' が必要なのがちょっと違いますけどね。 q'#argius' note#' q'{argius' note}'Perl使いでない人のために補足。カッコ文字4種類 () {} [] <> の場合は対とな…

Oracle 関数 CHR,DUMP で制御文字を扱う

今まで使ったことの無かった、つまり用の無かった関数です。 Oracle 10g以降は正規表現が標準で使えるようになったので、また別のアプローチもあるかと思いますが、今回は9iでの話。 SQL*PLUSや通常のビューアでは、改行文字やタブ文字を見分けることができ…

Firebirdをインストール + JDBC接続

http://sourceforge.net/projects/firebird/files/ の firebird-MacOS-X_darwin/2.1.2-Release/FirebirdSS-2.1.2-18118-i686.pkg.zip(SuperServer,i686版) をダウンロード。ZIPを解凍したpkgをfinderで開いてデフォルトインストール。isqlという管理ツール…

Oracle SQL*Plus で変数を使う

普段はSQL*Plusを使わないので必要なかったんですけど、Pro*Cのソースに書かれたSQLをそのまま実行する必要があったので、バインド変数の指定の仕方を調べました。 SQL> var LIMIT NUMBER; SQL> execute :LIMIT := 3; PL/SQL procedure succeessfully comple…

JavaDB(Derby)のLIMITもしくはROWNUM

条件に合致するレコードの先頭5行だけ表示させたい場合、 # MySQL,PostgreSQLなど SELECT * FROM TABLE1 LIMIT 5 # Oracle SELECT * FROM TABLE1 WHERE ROWNUM <= 5のようにします。 では、JavaDB(Apache Derby)の場合はどう書くのでしょうか。

OracleJDBCのgetObjectでDATE型をjava.sql.Timestampとして取得

OracleのDATE型は時刻情報を保持しますが、ResultSet.getObject()で取得すると、(たぶん9i,10gでは)java.sql.Dateにマッピングされ、時刻が切り捨てられてしまいます。ResultSet.getTimestamp()なら日時を取得できますので、これを使えるのであればあっさ…

SQLite+JDBC+Stew

StewでSQLiteに接続するのは、実はまだやったことがありませんでした。 今回、Trac関連でDBを直接覗くために試しました。※この実験は、Stewのプラグイン的な接続設定で動作するかどうかを試したものです。普通にCLASSPATHに通せば問題なく動作すると思います…

Oracle SQL*Plus NUMBER型の表示桁数を指定

Oracle/SQL*Plus - おしごとおぼえがき Wiki* NUMBER型で桁が大きいと、指数表記になります(デフォルトでは>10桁)。 SQL> SELECT 1234567890 FROM DUAL; 1234567890 ---------- 1234567890 SQL> SELECT 12345678901 FROM DUAL; 12345678901 ----------- 1.23…

UNION と UNION ALL の違いを忘れた

UNIONで結合した結果が思ったとおりにならないので、良く良く考えてみたら、UNIONだと重複した結果が残らない、というのをすっかり忘れていました。 以前はちゃんと UNION ALL で実装していたのに。なので、コーディングミスではないんです。 UNION の場合 S…

Oracle Date型をTO_CHARなしで「日時」表示する

OracleはTIMESTAMP型があるのに、伝統的にDATE型を使うので、タイムスタンプ的な列を出力するときにちょっと面倒。 通常はGUIのデータベースビューアを使いますが、場合によってはSQL*PLUSを使う必要があります。列名を指定すれば、 SELECT TO_CHAR(SYSDATE,…

Oracle 8i ではJOINが使えない

使えなくても問題なかったんですが、何度やっても「SQLコマンドが正常に終了していません」とか怒られるので、何でかなーと思ったら、まだサポートされてなかったんですね。 -- JOINが使える SELECT A.NAME, B.CODENAME FROM A OUTER JOIN B ON A.ID = B.ID …

SQLの集合関数の応用

数種類の集計を効率的にできないかな、と調べてみたら、あっさり見つかってしまいました。おまけに、DBMS固有のでも無く、最新の仕様よりも前からサポートされていたりするものもあるようです。SQLってたまに使うと便利ですね。 これから紹介するのは、それ…

簡易データベースの実装

配列の配列を、SQLを使って操作できるようにしたものを作ってみました。簡易なので、制限は山ほどありますが、一部は以下のようなものです。 SQLと言っても、限られたものしか使えない SELECT,UPDATE,INSERT,DELETE,WHEREと不完全な CREATE TABLE 内部値は全…

Oracleのパフォーマンスについて

色々あって、Oracleのパフォーマンスに関すること、特に実行計画(EXPLAIN PLAN)やオプティマイザについて調べてみました。といっても初歩的なものですが、それでも基本的なアルゴリズムが分からない方には難しいかも知れません。 これまで私はデータベースの…

java.sql.Timestampクラスの説明がおかしい?

今まで別の問題だと勘違いして放置していたんですが.....まず、Java開発者向けドキュメントの"JDBC入門"の「SQL と Java の型のマッピング」という章で、以下のようなサンプルコードが書かれています。(最後の行だけ私が追加しました。) Timestamp t = new T…

OracleJDBCドライバの"_g"について

Oracle JDBC Drivers README javacの"-g"オプションをつけたかどうかの違いだそうです。他のよく分からないドライバについても書いてあります。

ResultSetMetaData#getTableName(int)が使えない

ResultSetからテーブル名を取得したいのですが、このメソッドが使えない(値が空になる)ので困りました。JDBC2.0では既にサポートされてるんですけどね。 手近で触れるRDBMSだとこんな感じです。(名称は厳密なものではありません。)使えるもの Apache Derby 1…

Apache Derby

JDBCのテストを行うのに、ネットワークを介したRDBMSを使いたくなかったので、試してみました。 何も考えずにインストール バージョンは10.2.2.0。下記のサイトを参考にしました。 404 Error - Not Found ダウンロードして適当なディレクトリに配置し、クラ…

Oracle:LOBのサイズを取得する関数

OracleのテーブルにあるLOB(ラージオブジェクト)のサイズを調べたいので、簡単なプログラムを書こうと思ったが、そういうのって関数とか普通用意されてるよね? と気づき、調べてみた。 DBMS_LOB.GETLENGTH() 例:SELECT DBMS_LOB.GETLENGTH(LOB_COLUMN) FRO…

OracleのBlob その後(1)

9/27のコメントで予告しましたが、調べてみたので報告します。JDBC限定です。 実行環境は、WindowsXP Professional SP2 + JDK 1.4.2_11 + Eclipse 3.0.1で、最初はOracleだけ調べようと思ったのですが、PostgreSQLとMySQLでも調べてみることにしました(下記…

OracleのBlob

これ推測が多いです。 実用性を考えると、バージョンアップで美しく改善するより、下位互換性を維持することのほうが重要とは思うが、とにかく美しくないな、と思う。"VARCHAR2"然り、"RTRIM(NAME) IS NULL"然り。"BLOB≠java.sql.Blob"というのを知ってたま…

Oracle10g 無償版

Error Page 404 (http://d.hatena.ne.jp/sardine/20060810#p1 経由) こういう調査を怠っている私はヤバイ。まとめとか見てる場合じゃねぇー>自分。やっぱり、こっちを使うべきですね。だけど、本当はPostgresに慣れちゃったし、ユーザ登録要るし、Oracleの(…

PostgreSQL8.0.7に置き換え

ちょっと前に8.0.7立てたけど、困ったことに型の扱いが厳しくなったみたい。Java1.4で試しています。 7.5.3の時点ではこれはOKでした。 > INSERT INTO TEST (A_NUMBER) VALUES ('0') # A_NUMBER's type is BIGINTところが、8.0.7では、 org.postgresql.util.…

from Oracle to PostgreSQL (2)

続き。関数は、ユーザ定義でエミュレートする。例えば、以下のようにする。 CREATE FUNCTION NVL(CHAR, CHAR) RETURNS CHAR AS ' BEGIN IF $1 IS NULL THEN return $2; END IF; RETURN $1; END; ' LANGUAGE SQL ユーザ定義も含めて関数のシステムテーブルは"…

from Oracle to PostgreSQL

Oracleに依存したSQLプログラム部分をPostgreSQL用に書き換える、のメモ。 JDBC URL jdbc:oracle:thin:@hostname:1521:schema jdbc:postgresql://hostname:5432/dbname Type (完全な互換ではなく読み替え) CHAR VARCHAR2 NUMBER(I,D) DATE CHAR VARCHAR INTE…

データベースの空文字列

Oracleでcharまたはvarchar2の文字列フィールド NAME VARCHAR2(32) (NULL可) に対して、「nullまたはスペース文字列」という条件で問い合わせを行おうとして、次のようなWHERE句を書いた。 WHERE NAME IS NULL OR LTRIM(RTRIM(NAME)) = '' これだと、NAMEがn…