goo

SQL Developer 2.1.1は(使える状態にするのが)面倒

さすがにSQL*Plusで複数データを適当に更新するのは面倒なので、SQL Developerの最新版を使ってみることにした。

そしたら、ダウンロードからしてハマるし(嘆)
以前使っていたアカウントだとログインエラーになる。「パスワード忘れ」でパスワードを送ってもらっても、そのパスワードで間違ってないし!

仕方ないので新しいアカウントを作ることにした。今はアカウント名はメールアドレスらしい。
それはいいんだが、新しいパスワードがエラーになる。エラー原因は何も表示されないので、さっぱり分かんねぇ!(怒)
たぶん複雑でないからいけないんだろうと想像して英大小文字+数字にしたら通ったけど。(ヘルプも探したけど、パスワードの仕様の説明は見当たらなかった)
それくらい想像できないとOracleは使わせないってことなのか?

でダウンロードできたから早速実行してみたら、起動時にエラーが発生。JavaVMのインスタンスが作れんとか言ってjvm.dllを名指しされてもどうすればいいのか分からんよ(憤)
ググってみると、seraphyさんの『Oracle SQL Developer が起動できない場合の設定変更』がバッチリ!
エラー原因の確かめ方から対処方法まで書いてあって、完璧。素晴らしい。

後はすんなり動いた。
メニューとかが日本語になってるし、動作もちょっと軽くなったような気がする。
起動は相変わらず遅い(スプラッシュウィンドウ自体が出てくるのが遅いのはいただけない)けど、終了は速くなった気がするw

コメント ( 0 ) | Trackback ( 0 )

Oracle TIPS 2010年残

年末なので(というかまとまった休みに入ったので)、今年書いておこうと思って結局書いてなかったちょっとしたメモ(TIPS)をいよいよ書こうと思って、まずはOracle分。

「大抵の場合、INはEXISTSに置き換えられる」というのは有名な話だけど、「じゃあどういう場合は置き換えられないのか?」というのは疑問に思っていた。
そこをミックさんが明確に書いていたので、これはメモしておかなければ。

…しかしあれだな、やっぱまとめて書こうとすると面倒だな(爆) やはりその都度書いていかないと(苦笑)

コメント ( 0 ) | Trackback ( 0 )

Oracle ファンクション索引

Oracleインデックスで、演算(式)を指定したインデックスを作れることは知っていたが、それをファンクション索引と呼ぶことは知らなかった。
で、降順のインデックスを作成するとファンクション索引になるという事も知らなかった…。
コメント ( 0 ) | Trackback ( 0 )

Oracle RETURNING

スレイヤーズRETURNとかエルフを狩るモノたちリターンズとかの戻ってきた連中のことではなく(笑)、
OracleのINSERTUPDATEDELETE文には、RETURNING(RETURN)句という構文があるという話。
SQL実行時に対象となったデータのキー値などを別途取得することが出来る。

なんでRETURNINGに興味を持ったかと言うと、テーブル間のデータ移動(新しいテーブルにデータをコピーし、元のテーブルからは削除する)に使えそうだと思った為。
MERGE文調べていたのもその一環)
データ移動にはinsertとdeleteを実行する必要があるが、insert-selectを実行する際にROWNUMで件数を絞り(多すぎるとバッファーに負荷をかけてしまうから)、実際に挿入したデータのキーをRETURNINGで取得してdeleteのWHERE条件に指定できないか、と思った為。

まぁ、実際には色々な理由により、この目的には使用できなかったわけだが(苦笑)
・INSERT文でSELECTを使用する構文では、RETURNINGを使うことが出来ない!
・実行結果が複数行になった場合に、それらの値をRETURNINGから取得する方法が分からない。(JDBCでの取得方法が分からないが、PL/SQLでも外部(SQL*Plus)に返す方法はよく分からない。謎のテーブル(テーブルコレクション)を使えば出来そうだが、ストアドファンクションを定義する方法は避けたい)

しかし、insert時にシーケンスを使って値を採番して、それを取得する目的には使えそうだ。

コメント ( 0 ) | Trackback ( 0 )

Oracleのminとかdeleteとか

Oracleでちょっと書こうと思っていたメモのうち、min・maxdelete文について書いた。
もっと他にも小ネタは色々あるけれど、いちいち検証しながら書くと、やっぱり時間がかかる(嘆)

まぁ、今回は、Oracle用のindex.htmlを作って、他のページのリンクをそっちへ張り替える作業(手動)に時間をとられたりしたんだが(苦笑)
そういえば今年のテーマは、それをするツールの作成だったんだよなー…(汗)
Hadoopが興味深いもんで、予定以上に時間を割いてる^^;

コメント ( 0 ) | Trackback ( 0 )

OracleのMERGE文

久しぶりにOracleのネタ。MERGE文についてメモ。

データが有ればUPDATE、無ければINSERTを実行する構文。
Oracle9iから使えるようになったが、Oracle10g以降で構文が拡張されている。WHERE条件を指定できるようになったのは便利。
何より、Oracle9iではけっこうバグがあるらしい(苦笑)

Oracle10gではDELETE機能が加わったということなので、データの移動が出来るのかと期待したんだけど、そういう訳ではなく。
データ取得元テーブルのデータを消すのではなくて更新先テーブルから条件に応じて削除するものだった。
ドキュメントのDELETEの条件に書かれている「ON句によって定義された結合に含まれない」というのが何を指すのかいまいち理解できないけど…)
…一定件数ずつコミットしつつ特定範囲のデータを全件移動させるには、どういう方法を採るのが一番いいのかなー…?

ちなみにMERGE内のINSERT・UPDATE実行時にトリガーも動くようだが、そこまで試してない。
DELETEはUPDATEされた行に対してだけ適用されるようなので、トリガーがどう動くのか、ちょっと興味はあるけれど(笑)

コメント ( 0 ) | Trackback ( 0 )

create tabe as select

Oarcleのテーブルについて(今さら)メモ。
ついでに項目のデータ型の変更とかについてもメモ。

えーと、テーブルを作るのにselect文を使えたはずだけどどう書くんだったっけ?
という疑問から。
単純にselect * だけでなく、もうちょっと色々書けるんだなぁ。

で、プライマリキー制約の名前の変更方法についても調査。
まぁ制約名の変更インデックス名の変更の両方が必要だったわけだが。

うーん、既存テーブルから新しいテーブルを作りたいという事がモロバレの内容だな^^;

あと、テーブルに関連して、Oracle10gのリサイクルビンのページを整理した。
情報は特に変わってないんだけど、我ながら見づらかった(分かりづらかった)のなんのって(爆)

コメント ( 0 ) | Trackback ( 0 )

COUNTとCASE式

あるテーブルからちょっとずつ条件を変えて何種類かの件数をカウントしたい場合、集計関数COUNTを使ったSQLのWHERE条件を変えて何回も実行することになる。
しかしテーブルの件数が多くて、条件からしてフルスキャンになるような場合では、1つのSQLにまとめて1回だけで出来ないものかと思う。
で色々考えた結果、SUM(DECODE(〜,1,0))を参考にして、COUNTで指定する式にCASE式を使う方法を思い付いた!
(思い付いたも何も、知ってる人から見れば今さら何をって感じだけど(苦笑))

COUNT(*)以外の使い方の場合、COUNT()には定数値や項目名を指定するようなイメージがあったけど、実際はSQL式なら何でもいい。
CASE式はWHERE句と同じように条件が指定できるので、とても便利だ^^

あと、昔自分で書いたCOUNTの実行結果の例を見ていて、検証の間違いを発見(汗)
NULLと四則演算をした場合の結果はNULLになるので、NULLと文字列結合をしたらNULLになると思い込んでいたが、そうではなく、元の文字列がそのまま返ってた。
実行結果自体がそうなってるのに、なんでそんな勘違いをしていたんだろう…(恥)

コメント ( 0 ) | Trackback ( 0 )

パーティション指定SQL

Oracleでテーブルをパーティション化した際に、パーティションを指定したSELECT文を実行できるのは知っていたけれど、INSERT文でも指定できるんだー。

試してないけど、この調子ならUPDATE文でも指定できるかな?

…逆に、パーティションを指定しないUPDATEで、パーティションキーとなっている項目を更新するのが出来ないのは何故だろう…。
更新したらパーティションを移動してくれても良さそうな気がするんだけどなー。

コメント ( 0 ) | Trackback ( 0 )

ユーザー定義型

Oracleのユーザー定義型(TYPE)についてメモ。

…本当はJavaDBのシステム系テーブルの項目の型にJavaのクラスがそのまま使われていたので、これってどうやって実現しているのか知りたくて調べ始めたんだけど。
Oracleの場合はCREATE TYPE文でユーザー定義型(オブジェクト)が作れて、それがそのままJavaのクラスに一致しているようだ。

でもJavaDBにはTYPEは無いようなので、どうなってるんだろう?
他にもJavaDBのシステム系テーブルではBoolean型の項目があって、これも実現方法が不明。もっともこちらは、Derbyの現時点のバージョンではサポートしてないって書いてあったので、将来サポートされるのかも。(で、それが先に使われているのかも。)

コメント ( 0 ) | Trackback ( 0 )
前ページ