ひしだまHPの更新履歴。 主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。
ひしだまの変更履歴
SQL Developer 2.1.1は(使える状態にするのが)面倒
さすがにSQL*Plusで複数データを適当に更新するのは面倒なので、SQL Developerの最新版を使ってみることにした。
そしたら、ダウンロードからしてハマるし(嘆)
以前使っていたアカウントだとログインエラーになる。「パスワード忘れ」でパスワードを送ってもらっても、そのパスワードで間違ってないし!
仕方ないので新しいアカウントを作ることにした。今はアカウント名はメールアドレスらしい。
それはいいんだが、新しいパスワードがエラーになる。エラー原因は何も表示されないので、さっぱり分かんねぇ!(怒)
たぶん複雑でないからいけないんだろうと想像して英大小文字+数字にしたら通ったけど。(ヘルプも探したけど、パスワードの仕様の説明は見当たらなかった)
それくらい想像できないとOracleは使わせないってことなのか?
でダウンロードできたから早速実行してみたら、起動時にエラーが発生。JavaVMのインスタンスが作れんとか言ってjvm.dllを名指しされてもどうすればいいのか分からんよ(憤)
ググってみると、seraphyさんの『Oracle SQL Developer が起動できない場合の設定変更』がバッチリ!
エラー原因の確かめ方から対処方法まで書いてあって、完璧。素晴らしい。
後はすんなり動いた。
メニューとかが日本語になってるし、動作もちょっと軽くなったような気がする。
起動は相変わらず遅い(スプラッシュウィンドウ自体が出てくるのが遅いのはいただけない)けど、終了は速くなった気がするw
Oracle TIPS 2010年残
年末なので(というかまとまった休みに入ったので)、今年書いておこうと思って結局書いてなかったちょっとしたメモ(TIPS)をいよいよ書こうと思って、まずはOracle分。
- シーケンスの現在値の変更方法
- INをEXISTSに置き換える話
- =をINに置き換えずにanyを使う話
- TO_CHARで曜日や数値を変換する話
- NULLに関するミックさんのページへのリンク
「大抵の場合、INはEXISTSに置き換えられる」というのは有名な話だけど、「じゃあどういう場合は置き換えられないのか?」というのは疑問に思っていた。
そこをミックさんが明確に書いていたので、これはメモしておかなければ。
…しかしあれだな、やっぱまとめて書こうとすると面倒だな(爆) やはりその都度書いていかないと(苦笑)
Oracle RETURNING
スレイヤーズRETURNとかエルフを狩るモノたちリターンズとかの戻ってきた連中のことではなく(笑)、
OracleのINSERT・UPDATE・DELETE文には、RETURNING(RETURN)句という構文があるという話。
SQL実行時に対象となったデータのキー値などを別途取得することが出来る。
なんでRETURNINGに興味を持ったかと言うと、テーブル間のデータ移動(新しいテーブルにデータをコピーし、元のテーブルからは削除する)に使えそうだと思った為。
(MERGE文を調べていたのもその一環)
データ移動にはinsertとdeleteを実行する必要があるが、insert-selectを実行する際にROWNUMで件数を絞り(多すぎるとバッファーに負荷をかけてしまうから)、実際に挿入したデータのキーをRETURNINGで取得してdeleteのWHERE条件に指定できないか、と思った為。
まぁ、実際には色々な理由により、この目的には使用できなかったわけだが(苦笑)
・INSERT文でSELECTを使用する構文では、RETURNINGを使うことが出来ない!
・実行結果が複数行になった場合に、それらの値をRETURNINGから取得する方法が分からない。(JDBCでの取得方法が分からないが、PL/SQLでも外部(SQL*Plus)に返す方法はよく分からない。謎のテーブル(テーブルコレクション)を使えば出来そうだが、ストアドファンクションを定義する方法は避けたい)
しかし、insert時にシーケンスを使って値を採番して、それを取得する目的には使えそうだ。
OracleのMERGE文
久しぶりにOracleのネタ。MERGE文についてメモ。
データが有ればUPDATE、無ければINSERTを実行する構文。
Oracle9iから使えるようになったが、Oracle10g以降で構文が拡張されている。WHERE条件を指定できるようになったのは便利。
何より、Oracle9iではけっこうバグがあるらしい(苦笑)
Oracle10gではDELETE機能が加わったということなので、データの移動が出来るのかと期待したんだけど、そういう訳ではなく。
データ取得元テーブルのデータを消すのではなくて更新先テーブルから条件に応じて削除するものだった。
(ドキュメントのDELETEの条件に書かれている「ON句によって定義された結合に含まれない」というのが何を指すのかいまいち理解できないけど…)
…一定件数ずつコミットしつつ特定範囲のデータを全件移動させるには、どういう方法を採るのが一番いいのかなー…?
ちなみにMERGE内のINSERT・UPDATE実行時にトリガーも動くようだが、そこまで試してない。
DELETEはUPDATEされた行に対してだけ適用されるようなので、トリガーがどう動くのか、ちょっと興味はあるけれど(笑)
create tabe as select
Oarcleのテーブルについて(今さら)メモ。
ついでに項目のデータ型の変更とかについてもメモ。
えーと、テーブルを作るのにselect文を使えたはずだけどどう書くんだったっけ?
という疑問から。
単純にselect * だけでなく、もうちょっと色々書けるんだなぁ。
で、プライマリキー制約の名前の変更方法についても調査。
まぁ制約名の変更とインデックス名の変更の両方が必要だったわけだが。
うーん、既存テーブルから新しいテーブルを作りたいという事がモロバレの内容だな^^;
あと、テーブルに関連して、Oracle10gのリサイクルビンのページを整理した。
情報は特に変わってないんだけど、我ながら見づらかった(分かりづらかった)のなんのって(爆)
COUNTとCASE式
あるテーブルからちょっとずつ条件を変えて何種類かの件数をカウントしたい場合、集計関数COUNTを使ったSQLのWHERE条件を変えて何回も実行することになる。
しかしテーブルの件数が多くて、条件からしてフルスキャンになるような場合では、1つのSQLにまとめて1回だけで出来ないものかと思う。
で色々考えた結果、SUM(DECODE(〜,1,0))を参考にして、COUNTで指定する式にCASE式を使う方法を思い付いた!
(思い付いたも何も、知ってる人から見れば今さら何をって感じだけど(苦笑))
COUNT(*)以外の使い方の場合、COUNT()には定数値や項目名を指定するようなイメージがあったけど、実際はSQL式なら何でもいい。
CASE式はWHERE句と同じように条件が指定できるので、とても便利だ^^
あと、昔自分で書いたCOUNTの実行結果の例を見ていて、検証の間違いを発見(汗)
NULLと四則演算をした場合の結果はNULLになるので、NULLと文字列結合をしたらNULLになると思い込んでいたが、そうではなく、元の文字列がそのまま返ってた。
実行結果自体がそうなってるのに、なんでそんな勘違いをしていたんだろう…(恥)
ユーザー定義型
Oracleのユーザー定義型(TYPE)についてメモ。
…本当はJavaDBのシステム系テーブルの項目の型にJavaのクラスがそのまま使われていたので、これってどうやって実現しているのか知りたくて調べ始めたんだけど。
Oracleの場合はCREATE TYPE文でユーザー定義型(オブジェクト)が作れて、それがそのままJavaのクラスに一致しているようだ。
でもJavaDBにはTYPEは無いようなので、どうなってるんだろう?
他にもJavaDBのシステム系テーブルではBoolean型の項目があって、これも実現方法が不明。もっともこちらは、Derbyの現時点のバージョンではサポートしてないって書いてあったので、将来サポートされるのかも。(で、それが先に使われているのかも。)
| 前ページ |

