新規無料会員登録で1000名様に電子コミック1000円分が当たる!!

DB2でのストアドプロシージャの作成方法を教えて下さい。

アプリケーションサーバツールキットを使用せずに、
DB2のコントロールセンターなどで作成することはできないのでしょうか。

コントロールセンター以外での作成方法も含め、どんなことでもいいのでアドバイスお願いします!

よろしくお願いします。

このQ&Aに関連する最新のQ&A

DB 作成」に関するQ&A: JavaでDB作成

A 回答 (2件)

DB2 V8.2での例ですが、


たとえば、以下の内容をファイル(test.sql)に保存して、

CREATE PROCEDURE LISTBP()
DYNAMIC RESULT SETS 1
READS SQL DATA
LANGUAGE SQL
BEGIN
DECLARE c CURSOR WITH RETURN TO CALLER FOR
SELECT * FROM SYSCAT.BUFFERPOOLS FOR FETCH ONLY;
OPEN c;
END
@


このファイルを

db2 connect to xxx
db2 -td@ -vf test.sql

と実行するとLISTBP()というストアドプロシージャが作れます。
    • good
    • 0

DB2はSQLプロシージャが使えるんじゃなかったでしょうか。

データ定義のスタートメントを選択してSQLストアドプロシージャの生成でウィザードで作成できると思ったのですが・・。定かではありません。
ストアドプロシージャの代用としてDB2はUDU(ユーザー定義関数)があると思います。UDFはCREATE FUNCTION文で作成します。記法は変数宣言や制御文に関してはSQLプロシージャと同じ。

DROP PROCEDURE プロシージャ名@
CREATE PROCEDURE プロシージャ名
(IN job名とタイプ)
LANGUAGE SQL
BEGIN
ここから処理
END
@
こんな感じではなかったかと思います。
思い違いだったらゴメンなさい。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDB2でのシステム日付のinsert、updateについて。

質問です。
DB2で、システム日付のinsert、updateを行うSQLを作成したいのですが、どのようにしたら良いでしょうか?

また、参考になるようなサイトなどありましたら教えてください。

どなたか宜しくお願いします。

Aベストアンサー

そうですか・・・。
DB2V8 FP2 on WinXPProのCLPではうまくいっていますが・・・。

(成功例)

db2 connect to sample
db2 create table hoge(no integer,date date)
db2 insert into hoge values (1,current date)
db2 update hoge set date=current date where no=1

ちなみに

db2 update hoge set date=current date where no='1'

⇒SQL0401N(SQLSTATE=42818)エラー

db2 update hoge set date=integer(current date) where no=1

⇒SQL0408N(SQLSTATE=42821)エラー

でした。
no列はINTEGER型で間違いないんですよね?
以下はどういうエラーになりますか?

db2 update hoge set date=current date

そうですか・・・。
DB2V8 FP2 on WinXPProのCLPではうまくいっていますが・・・。

(成功例)

db2 connect to sample
db2 create table hoge(no integer,date date)
db2 insert into hoge values (1,current date)
db2 update hoge set date=current date where no=1

ちなみに

db2 update hoge set date=current date where no='1'

⇒SQL0401N(SQLSTATE=42818)エラー

db2 update hoge set date=integer(current date) where no=1

⇒SQL0408N(SQLSTATE=42821)エラー

でした。
no列はINTE...続きを読む

QDB2のSQL(日付)について

文字列で8桁の日付(例:20041208)を持っている項目の条件に本日日付以上という条件をつけたいのですが、
(例:where NEN >= 本日日付の文字列8桁 )
※NEN:20041208
SQLでシステム日付を文字列8桁にする方法はありますか?
ご教授お願いしますm(_ _)m

Aベストアンサー

(前にも回答したと思うのですが、入っていないようなので再度入力します)

大小の比較をしたいのでしたら、DATE型を文字列にしても駄目で、文字列をDATE型に変換する必要があります。
8文字で表された日付をDATE型に変換する関数はDB2には用意されていないので、自分で用意する必要があります。

CREATE FUNCTION STR2DATE (dateString VARCHAR(8))

RETURNS DATE

SPECIFIC STR2DATE

LANGUAGE SQL

DETERMINISTIC

CONTAINS SQL

BEGIN ATOMIC

DECLARE ret VARCHAR(10);



IF (LENGTH(dateString) != 8) THEN

RETURN DATE('1970-01-01');

END IF;



set ret = LEFT(dateString,4) || '-' || SUBSTR(dateString,5,2) || '-' || RIGHT(dateString,2);



RETURN ret;

END@

という感じでSTR2DATE関数を用意しておいて、
SELECT ... WHERE STR2DATE(NEN) >= CURRENT DATE
とやればうまくいくのではないでしょうか。

(前にも回答したと思うのですが、入っていないようなので再度入力します)

大小の比較をしたいのでしたら、DATE型を文字列にしても駄目で、文字列をDATE型に変換する必要があります。
8文字で表された日付をDATE型に変換する関数はDB2には用意されていないので、自分で用意する必要があります。

CREATE FUNCTION STR2DATE (dateString VARCHAR(8))

RETURNS DATE

SPECIFIC STR2DATE

LANGUAGE SQL

DETERMINISTIC

CONTAINS SQL

BEGIN ATOMIC

DECLARE ret VARCHAR(10);



IF (LENGTH(...続きを読む

Q日付の加算・減算ってできますか?

DB2でのSQLで日付の加算・減算が出来なくて困っています。
DateAddのような関数はないんだとは思いますが、同じような機能を実現させることは出来ないんでしょうか?
ご回答をお願いします。

Aベストアンサー

できますよ。
例えば次のような感じ。

$ db2 values current date

1
----------
2005-04-01

1 レコードが選択されました。


$ db2 values current date + 1 day

1
----------
2005-04-02

1 レコードが選択されました。


$ db2 values current date - 1 day

1
----------
2005-03-31

1 レコードが選択されました。

QDB2のTimestamp型

DB2のTimestamp型のカラムに
'Current-Timestamp'以外で
設定可能なデフォルト値というのは
あるのでしょうか?

Aベストアンサー

以下のURLが参考になると思います。

参考URL:http://www-06.ibm.com/jp/software/data/developer/library/techdoc/daytime.html

QDB2のコマンドラインexportで複雑なselectの指定は可能?

オラクルだとspoolでselect文の出力結果をCSV形式等にして取得できるのですが、DB2で同じ事が可能かと調べてます。db2コマンドのexportを使えばできそうかと思うのですが、複雑なselect文の時にコマンドラインに全部書かなければならないのか、他に手段があるのか、悩んでいます。

Aベストアンサー

export コマンドを使ったCVS形式でのファイル出力    →できます
コマンドラインではなく外部ファイルを使用したSQLの実行 →できます

具体的なやり方
以下のファイル(hoge.txt)を作成する。
----------------------------------------------------------
connect to DB名 user DBユーザー名 using パスワード;
export to ファイル名 of del SQL文(ex select * from hoge) ;
connect reset;
----------------------------------------------------------
db2 -tvf hoge.txt

でできます。
windowsだと、db2コマンドウィンドウで、
UNIX、Linuxなら、db2インスタンスユーザー等、
db2コマンドが使える状態になっていないとできません。

参考URL:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/core/r0008303.htm

export コマンドを使ったCVS形式でのファイル出力    →できます
コマンドラインではなく外部ファイルを使用したSQLの実行 →できます

具体的なやり方
以下のファイル(hoge.txt)を作成する。
----------------------------------------------------------
connect to DB名 user DBユーザー名 using パスワード;
export to ファイル名 of del SQL文(ex select * from hoge) ;
connect reset;
----------------------------------------------------------
db2 -tvf hoge.txt

でできます。
window...続きを読む

QSQL:TIMESTAMPの期間検索を指定するには?

教えてください。

SQL文で日付期間の検索をしたいです。

フィールド名:tran_dataの値が、
2004/09/01 ~ 2004/09/03 のデータを検索したい。

データはTIMESTAMPで取得されています。
テーブル名:dat_history

【失敗例】
select * from web.dat_history where tran_date = '2004-08-18'

【エラーメッセージ】
日付値のストリング表記が間違っています。

Aベストアンサー

DBMSはなんでしょう?

とりあえずOracleの場合。

select * from web.dat_history where to_char(tran_date, 'yyyy/mm/dd') between '2004/09/01' and '2004/09/03';

ですね。

Qバッチファイルから直接db2コマンドに引数を持たせて実行したい

バッチファイルより、得たデータを引数としてdb2コマンドに私、実行したいのですが、そのようなことはできるでしょうか。
(詳細)
バッチファイルで、日付&時間を変数に格納します。これを、db2のテーブルにインポートしたい。
稚拙な質問で申し訳ありません。

Aベストアンサー

例えばバッチファイルの中でsub.batを以下のように呼び出すと良いと思います。

db2cmd sub.bat 引数

するとsub.batの中ではdb2コマンドを使用することが出来ます。
また、sub.batでは引数を%1%等で受け取ることが出来ます。

QDB2の更新ロックについて

DB2 v7を使用しています。
select文で更新ロックをかけました。
PreparedStatementとresultsetをcloseした後、同Connectionでupdate文をかけました。
このとき、select文のロックがかかってるのかわかりませんが、エラーも出ずに更新ができませんでした。
更新ロックのかけ方は 普通のselect文の最後に for updateとしただけです。updateは普通にupdateを行いました。

現在の状況としては、更新ロックがかかっているのかどうかわからないという状態です。
そこで、
(1)更新ロックがかかっているのかどうかを調べる方法があれば、その方法が知りたい。
(2)更新ロックの解除の方法をしりたい。
(3)select文で更新ロックをかけた場合の特別なupdateの方法が、その方法をしりたい。

どなたかご存知のかたがいらっしゃいましたらご教授くださいますようよろしくお願いいたします。

win2000
jdk1.3

Aベストアンサー

(1)
db2のコマンドウィンドウから「db2 get snapshot for locks on データベース名」とするとロックの一覧を参照できます。どのアプリケーションがどのようなロックを取得しているかがわかります。また、更新ロックを保持している間に他のコネクションから該当行(テーブルロックの場合は該当テーブル)に対して更新を行えないことで確認できます。この際にロックタイムアウトまでの待ち時間を無限に設定していると、いつまでたってもロック獲得待ちのままになります。
(2)
コミットまたはロールバックでロックは解除されます。このことはすべてのロックに関していえます。
(3)
特別な方法はありません。更新ロックを獲得した後は同一コネクションからであれば排他ロックを獲得できます(更新できます)。

よく覚えていませんが、更新ロックに関してもロック保持期間が分離レベルで異なっていたような気がします。特に指定しなければ分離レベルはCS(ReadCommited)ですので、(コミットやロールバックを行わなくても)カーソルが離れた瞬間にロックが開放された気がします。

(1)
db2のコマンドウィンドウから「db2 get snapshot for locks on データベース名」とするとロックの一覧を参照できます。どのアプリケーションがどのようなロックを取得しているかがわかります。また、更新ロックを保持している間に他のコネクションから該当行(テーブルロックの場合は該当テーブル)に対して更新を行えないことで確認できます。この際にロックタイムアウトまでの待ち時間を無限に設定していると、いつまでたってもロック獲得待ちのままになります。
(2)
コミットまたはロールバックでロック...続きを読む

QDB2でのロック

Oracleで今まで開発しており今回始めてDB2での開発を行うものです。

Oraleと同じロックのかけ方をDB2で行いたいのですが、どのように記述すればよろしいでしょうか。

かけたいロックは
・セレクトした対象行のみにロックをかける
・他のセッションからは、ロック前の情報を参照可能
・コミットまたはロールバックを行うまでロックを保持する
です。

よろしくお願いします。

Aベストアンサー

OracleもDB2もデフォルトのトランザクション分離レベルはRead Committedですがトランザクション制御の実装の仕方が違います。
DB2は検索時に共有ロックをかけます。しかし読み取るデータが更新中の場合はすでにそのデータに排他ロックがかかっているので共有ロックをかけることができません。
Oracleはマルチ・バージョン一貫性制御でUNDO表領域に保持された更新前の情報を読み込むので読み取るデータが更新中であっても検索処理が待たされることはありませんがDB2は更新中のデータに他クライアントはアクセスできないで検索処理が待たされます。
Uncommitted Readでダーティー・リードを許す方法がありますが実用的なアプリケーションにあまり使用されません。
ロック取得時間を短くするような排他制御のアプリケーション設計を行い検索処理と重複するタイミングを減らすことで回避するようにします。オプティミスティックロックの実装方法を用いるようになると思います。
でも頻繁に複数ユーザーが同時に同一データを変更するようなシステムだと更新に失敗する確率が高くなり利便性が悪く場合があります。

SELECT * FROM TABLE FOR UPDATE WITH RS

排他制御が必要な際はその都度、各SQL文にWITH句を用いて分離レベルを指定してください。カーソルオープン前に発行することでCOMMITかROLLBACK時までロックされた状態になります。
ロック待機への対処も異なります。ロック待機をせずすぐに制御を戻す場合、OracleはSELECT~FOR UPDATEにNOWAITオプションを指定しますがDB2ではNOWAITオプションに対応する機能をサポートしていません。ロック待機する時間をLOCKTIMEOUTパラメータで指定するしかありません。
以上の辺を確認してみてください。

OracleもDB2もデフォルトのトランザクション分離レベルはRead Committedですがトランザクション制御の実装の仕方が違います。
DB2は検索時に共有ロックをかけます。しかし読み取るデータが更新中の場合はすでにそのデータに排他ロックがかかっているので共有ロックをかけることができません。
Oracleはマルチ・バージョン一貫性制御でUNDO表領域に保持された更新前の情報を読み込むので読み取るデータが更新中であっても検索処理が待たされることはありませんがDB2は更新中のデータに他クライアントはアクセスで...続きを読む

QDB2のファイル読込み

DB2にinsert文を書いているファイルを読込ませて、実行させたいのですが、ORACLEで@に該当するコマンドがDB2に存在するのでしょうか?存在するなら教えてください。

Aベストアンサー

すでに解決されていますでしょうか?
当方、DB2は経験ないのですが、以下の情報を見つけましたので、参考になれば幸いです。

コマンド行プロセッサー (CLP)で、

入力ファイルからの読み取りオプション (-f):
-ffilename オプションを指定すると、コマンド行プロセッサーは標準入力ではなく指定したファイルから入力を読み取るようになります。
filename は、指定ファイルまでのディレクトリー・パスを含む絶対または相対ファイル名です。
ディレクトリー・パスを指定していない場合、現行ディレクトリーが使用されます。

他のオプションと一緒にオプション -f を指定する場合には、オプション -f は最後に指定する必要があります。
たとえば、次のようにします。

db2 -tvf filename

コマンド処理は QUITまたは TERMINATEが出されるまで、またはファイルの終わりまで続行されます。


例)

ファイル名:inshoge.ddl
---------------------------------------
connect to db;
insert into table1 values('hoge1',100);
insert into table1 values('hoge2',200);
insert into table1 values('hoge3',300);
connect reset;
---------------------------------------
※;(セミコロン)がステートメント終了文字で定義してあるステートメントファイルを実行し、結果を標準出力に出力する。

$ db2 -tvf inshoge.ddl

参考URL:http://www.db2.jp/siryo/db2online/db2n0/db2n067.htm#HDRCLPOPT

すでに解決されていますでしょうか?
当方、DB2は経験ないのですが、以下の情報を見つけましたので、参考になれば幸いです。

コマンド行プロセッサー (CLP)で、

入力ファイルからの読み取りオプション (-f):
-ffilename オプションを指定すると、コマンド行プロセッサーは標準入力ではなく指定したファイルから入力を読み取るようになります。
filename は、指定ファイルまでのディレクトリー・パスを含む絶対または相対ファイル名です。
ディレクトリー・パスを指定していない場合、現行ディレク...続きを読む


人気Q&Aランキング