2010-09-07

SQL Serverでのファイル出力込みのバッチ処理

SQL Serverで考える機会があったため、エントリー。

SQL Serverではストアドプロシージャを使用した複数レコードのファイル出力はコマンドレベルでサポートされていない。
sqlcmdを使用して出力できるのはPRINT文やメッセージ、あるいはSELECT文での結果の出力に限定される。

だがこれだと1レコード毎に処理しつつファイル出力できない。
カーソルを使用して処理を行い、正常処理されたレコードのみ出力するにはどうするか?

そんな時はファイル出力用のテーブルを用意しよう。
ストアドプロシージャで正常処理された結果のみそのテーブルに追加し、その後sqlcmdでselect文でファイル出力すれば良い。
処理中エラーが発生した時はエラーコードをかえしたり、エラーメッセージを返すストアドプロシージャを作成すればなお良い。

2010-04-11

SQLで複雑な条件で絞り込み

SQLで以下の問題を考えてみたのでメモ。

お題:人ごとに最高点のレコードのみ抽出する。最高点が複数あるときは受験日の最新のレコード1件のみとする。


-- create table
create table record (
user_id varchar(8) not null,
record_date date not null,
score integer not null,
note text,
primary key (user_id, record_date));



-- 人ごとの最高点のみだが、同点の場合複数表示(max使用)
select * from record a
where score = (select max(score) from record b
where b.user_id = a.user_id);


ALL句でも同じことができる。でもそれ以上の条件をつけられない。

-- 人ごとの最高点のみだが、同点の場合複数表示(all句使用)
select * from record a
where score >= all(select score from record b
where b.user_id = a.user_id);



まず、人ごとの最高点で最新の日付項目で絞り込み。

select user_id,score,max(record_date) from record a
where (user_id,score) in (
select user_id,max(score) from record b group by user_id) group by user_id,score;


それをキーとして使用して全フィールドを表示する。

select * from record c
where (user_id,record_date) in
(select user_id,max(record_date) from record a
where (user_id,score) in (
select user_id,max(score) from record b group by user_id) group by user_id,score);

できた!

2010-03-08

Tomcat6.xでのマルチレベルコンテキストの設定

マルチレベルコンテキストとは以下のようなもの

/parent/child1/
/parent/child2/


ディレクトリ階層を深く指定したWeb Application。

フォルダの配置は以下の様にする。
webapps/parent#child1/
webapps/parent#child2/


warファイルの場合
webapps/parent#child1.war
webapps/parent#child2.war


コンテキストファイル(context.xml)は以下の様なファイル名とする。
conf/Catalina/localhost/parent#child1.xml
conf/Catalina/localhost/parent#child2.xml


コンテキストファイルの中身のパスは階層フォルダ構成で記載する。
path="/parent/child1"


親階層、子階層でWebApplicationを構成することも可能。
webapps/parent#child/
webapps/parent/


conf/Catalina/localhost/parent#child.xml
conf/Catalina/localhost/parent.xml