select文プロシージャ呼び出し時のエラー

DERBYのプロシージャ呼び出しで、結果セットを取得しようと以下のコードを書いたところ、
エラーがでて解決するのに時間がかかった。

public static void main(String[] args) {
    ...

    Connection conn = DriverManager.getConnection("jdbc:derby:d:/temp/testdb");
    CallableStatement cstmt = conn.prepareCall("{call TEST_PROCEDURE()}");
    ResultSet rset = cstmt.executeQuery(); // error

    ...
}

public static void testProcedure(ResultSet[] rset) {
    ...

    Connection conn = DriverManager.getConnection("jdbc:derby:d:/temp/testdb");
    rset[0] = conn.prepareStatement("select * from articles").executeQuery();

    ...
}
CREATE PROCEDURE TEST_PROCEDURE()  
DYNAMIC RESULT SETS 1  
LANGUAGE JAVA  
EXTERNAL NAME 'com.db._jdbc_update.testProcedure'   
PARAMETER STYLE JAVA  
READS SQL DATA;

エラー内容

java.sql.SQLException: Statement.executeQuery() は、行カウントを戻すステートメントを使って呼び出せません。エラー・コード: 20000
Caused by: ERROR X0Y78: Statement.executeQuery() は、行カウントを戻すステートメントを使って呼び出せません。

原因はプロシージャ内のDB接続処理で指定しているURLがまずかった。正しくは以下。

    Connection conn = DriverManager.getConnection("jdbc:default:connection");

参考:[DERBY-501] Client and embedded drivers differ on invoking a procedure that returns a single Dynamic resultSet using CallableStatement.executeQuery() - ASF JIRA
なんでやねーん。

WindowsUpdate_80246008

Windows Updateを行った際に、以下のエラーがでてUpdate出来ない。

・WindowsUpdate_80246008

なぜいつからUpdate出来なくなったのか、良くわからなかった。
原因はWindowsヘルプの通り、
Background Intelligent Transfer Serviceが開始していないからだった。
開始させようと思っても依存サービスがどうたらで開始できない。

それで、前にCOM+ EventSystemイベントとCOM+ System Applicationイベントを
停止させたからか?と思い、開始させたら、Background〜サービスも開始した。
これらに依存していたのね。

いつからなったのかわからないけど、ソフトウェアのインストールを行うときに、本来ならば数秒で終わる処理量なのに数時間ぐらいかかるようになった。(ならないときもある)
そのときは決まってPCのCPUランプが一定時間おきに点滅を繰り返すようになるのだが。これを頼りにネットで調べまくった結果、COM+〜のサービスを停止すれば現象が起きなくなったという情報を見つけて、そのときに停止したものだった。

パソコン壊れているのかな。

パーフェクト Java

鼻水がとめどない〜〜もう本当に全然止まってくれない!
こんなに酷いのは今年で2回目だ。
今週末は社員旅行も控えてるし、体調管理しっかりしないと。

今月はこの本、全部読み切りたい。

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

いま半分ぐらいまで読んだ。

OracleMaster 11gSQL基礎 Bronze


Bronze Oracle Database 11g SQL基礎I編(試験番号:1Z0-051) (DVD付) (オラクルマスター教科書)


徹底攻略ORACLE MASTER Bronze SQL基礎1問題集 (ITプロ/ITエンジニアのための徹底攻略)


本日受かりました〜〜本当に難しかった・・・
DBAの方が少し余裕だったので、そんなに根詰めなくても余裕余裕と思って臨んだのですが、
全然知らない問題ばっかで焦っちゃてもー冷や汗でマウスベトベトにしてきちゃいました。
試験終わった瞬間はいろんな意味で終わったと思いましたが。
帰りの電車の中でcertview見て一安心でした。受かっててよかった。

本についてですが、上の2冊を利用しました。
上の本は定番っぽいやつですね。SQLPlusで実際に動かしたいな〜と思いつつも、分かりやすく記載されているので、
動かさなくても十分理解できます。
下の問題集は時間無くて全て目を通すことは出来なかったのですが、出題されている問題が
試験に比べて比較的簡単なような感じがしました。
なのでけっこうすらすら解けるので、試験に油断する可能性が高い!


順序がおかしい&今更ですがOracleBronzeを取る方法は3つあって、調べたところ以下のような感じ。
・Bronze DBA11g + 11gSQL基礎I
・Bronze DBA11g + BronzeSQL基礎I
・Bronze DBA11g + SQL + Oracle入門

1Z0-011 SQL      40分 20問 合格ライン70% ⇒ 現在試験受けれるのか謎
1Z0-012 Oracle入門 ? ? ? ⇒ 現在試験受けれるのか謎
1Z0-017 Bronze SQL基礎I 90分 40問 合格ライン70% ¥22260 ¥13600(オンライン試験)
1Z0-018 Bronze DBA11g 75分 48問 合格ライン60% ¥22260 ¥13600(オンライン試験)
1Z0-051 11g SQL基礎I 120分 55問 合格ライン60% ¥22260
参考:http://www.oracle.com/jp/education/examlist-172597-ja.html

1Z0-017の方が1Z0-051より簡単という記事をいくつかネットで見ましたが、
合格ラインが違ってたりするんですね。出題範囲とか見てませんが実際どうなんでしょう。
受けてみないと分からなそうですね。
またSQLの方はネットでも受けれるそうで、てかオンライン試験めっちゃ安いやことを今知った!
さいきん無線lanにして回線状態が不安定な時があるから、途中でエラーになったら困るもんで
めんどくさいから試験会場でいーやって受けたんだけど、こんなに安くなるの知っていたらlanケーブルさしてた!!!
愛想悪い試験会場のねーちゃんとも会話せずに済んだ!!くそー

何はともあれBronze取得出来ました。
silverは今のところ考えていません。

foreach Nullチェック

前に仕事でコーディング中に失敗したこと。

nullのコレクション変数に対してforeach文をあてがうと、Nullちんぽこ例外が起こる。
事前にNullチェックをしたいが、
if ( collection != null ) foreach... なんてださい。

public class Main {
	static <T> Iterable<T> nullGuard(Iterable<T> iter) {
		return iter == null ? Collections.<T>emptyList() : iter;
	}
	
	public static void main(String[] args) {
     	Double[] da = new Double[]{0.1, 0.2, 0.3};
		List<Double> ld = new ArrayList<Double>();
		ld.add(1.0);
		ld.add(2.0);

		for ( double d : nullGuard(ld)){
			System.out.println(d);
		}
		for ( double d : nullGuard(Arrays.asList(da))){
			System.out.println(d);
		}
	}
}
1.0
2.0
0.1
0.2
0.3

スマートにできるような、しかし微妙にきもい。さらにプリミティブな配列には対応できない。
template specialization使えば、と思ったけどJavaにはないみたい。
Java難しい。。。