ストアドプロシージャのメリットってなんだろう?
ストアドプロシージャって、プログラムでSQL文を直接書くことと比較して、実は次のようなメリットがあるんです。一般的なメリットは置いといて、あまり書かれていないことをご紹介します。
1. 一つのデータベースを、いろんな環境のアプリケーションが使用しており、共通の処理を行いたい場合。わかりにくいですよね。(^^; 具体例を挙げれば、SQL serverがあって、それをASP, ASP.NET, C#, VBなどのアプリが利用しているとします。そして、それぞれのアプリの実行時に、一定の条件を満たしている不要なレコードを削除するという処理を共通で行いたいとします。この時、いろんな言語でSQL文を組み立てて発行しますか? 作るのも大変ですが、削除の仕様が変わったときなどのメンテナンスも大変ですよね。そんな時に、ストアドプロシージャの出番。各環境のアプリケーションから、ストアドプロシージャを呼んでやればいいんです。ストアドプロシージャがサーバー側で実行されるというメリットを生かした、良い例ですね。
C#が、C#2.0になっても、VS2003がVS2005になっても、プログラムでSQLを組み立てて発行するわけじゃないから、簡単に移行できるはずです。ただ、ストアドプロシージャの呼び出し方法は変わるかもしれないですが。(^^;
2. ストアドプロシージャの中では自由にどんどんSQL文が書ける。って、これもわかりにくいですね。(^^; 具体例を挙げましょう。レコードを保存する時に、既に存在していれば更新し、存在していなければ新規に保存するという処理がよくあります。これをADO.NETで書こうと思うと、ちょっと面倒なんです。でも、ストアドプロシージャを使うと、以下のように意外に簡単に書けてしまいます。また、プログラムでSQL文で書くと、存在をチェックして、その後また保存か更新かのSQL文を投げなきゃなりません。つまり、クライアントからサーバーへ2往復しなきゃならないんですね。
Create Procedure usp_CT04_insertupdate ( @CT04KID INT , @CT04COMPDAYS INT ) as DECLARE @LOCAL_CT04ID INT SET @LOCAL_CT04ID = (select CT04ID from CT04 where CT04KID = @CT04KID) IF @LOCAL_CT04ID IS NULL BEGIN insert into CT04 ( CT04KID , CT04COMPDAYS ) values ( @CT04KID , @CT04COMPDAYS ) END ELSE BEGIN update CT04 set CT04KID=@CT04KID, CT04COMPDAYS=@CT04COMPDAYS where CT04ID=@LOCAL_CT04ID END return