e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第16回 「ストアド・プロシージャ概要」

2012.04.09

いままで(第1回~第15回)使用したPL/SQLのサンプルプログラムは、すべて「無名ブロック」という形式です。
「無名ブロック」とはクライアント側のプログラムから、Oracleデータベースサーバーに送信するPL/SQLブロックです。
クライアントのプログラムはユーザ側で開発したアプリケーションです。あるいは、SQL*PlusやSQL*Developerなどのツールでもかまいません。
とにかくクライアント側から、Oracleデータベースサーバーに送信するPL/SQLブロックは、「無名ブロック」です。

無名ブロックという言葉どおり、このブロックには名前がついていません。
Oracleデータベースはブロックをクライアント側から受信するとブロック内の処理を実行し、クライアント側にその結果を返します。
その一連の過程において該当PL/SQLブロックに名前がついている必要ありません。
よって、クライアント側からサーバーに送信するPL/SQLブロックには名前がつけられておらず、そういう意味で「無名ブロック」といいます。

この無名ブロックに名前をつけて、データベースに格納することができます。その代表例がストアドプロシージャです。
「ストアド」という言葉はデータべースに「格納された」という意味です。
プロシージャというのは、一連の処理手順という意味で簡単に言えば、プログラムのことです。
無名PL/SQLブロックに名前をつけたものと考えてください。名前があるからその名前を使ってコール(呼び出し)できる訳です。
実はデータベースに格納していないプロシージャ(ローカルなプロシージャといいます)も可能ですが、その話は重要ではないので、また別の機会にします。
また、名前をつけたPL/SQLブロックはプロシージャだけでなく、ファンクションやパッケージ、またイベントにより自動起動するトリガーなど他にもいろいろと種類があるのですが、それらも別の機会に解説します。
いずれにせよ、名前をつけたPL/SQLブロックとして最も基本的なものが、ストアド・プロシージャです。

ストアド・プロシージャは、それに対する実行権限さえあれば、基本的に誰でもそのストアド・プロシージャをコールできます。
つまり、同じプログラムを多くのユーザやアプリケーションで使いまわしできるわけです。
同じ内容の処理であれば、あちこちの無名ブロックの中にその処理を重複して記述するよりも、その処理をストアド・プロシージャ化することが望ましいといえます。
ストアド・プロジージャの処理内容に修正がある場合は、基本的には、そのストアド・プロシージャを修正するだけでよく、それをコールする側のプログラムは修正が不要です。すなわち、同一内容の処理を一つのプロシージャに一元化しておくことで、開発やメンテナンスの効率が上がるわけです。

それでは、今回はストアド・プロシージャの例として、消費税計算をするプロシージャをご紹介して文法的な詳細は次回以降に解説します。
簡単な例ですが以下をご覧ください。

<<税額計算するプロシージャ>>
SQL> CREATE OR REPLACE PROCEDURE PROC_TAX ( P1 IN NUMBER, P2 OUT NUMBER)
  2  IS
  3  BEGIN
  4     P2 := P1 * 1.05;
  5 END;
  6 /

プロシージャが作成されました。

SQL> SET SERVEROUTPUT ON

<<上記のプロシージャをコールする無名ブロック>>
SQL> DECLARE
  2    V_INPUT    NUMBER(5);
  3    V_OUTPUT   NUMBER(5);
  4  BEGIN
  5    V_INPUT := 1000;
  6    PROC_TAX(V_INPUT, V_OUTPUT);
  7    DBMS_OUTPUT.PUT_LINE('課税前金額=' || V_INPUT);
  8    DBMS_OUTPUT.PUT_LINE('課税後金額=' || V_OUTPUT);
  9  END;
10  /
課税前金額=1000
課税後金額=1050

PL/SQLプロシージャが正常に完了しました。

上記の例は、金額を受け取り、それを1.05倍した金額を返すプロシージャ(名前 PROC_TAX)を作成してます。
それを無名ブロックから、1000という金額を渡してコールし、1050という値で戻った値を、画面表示しているものです。
詳しくない方もなんとなく、処理の概要はつかめると思います。

それでは詳しい文法解説は次回以降説明します。今回はここまでにいたします。
次回、ご期待ください。

先頭へ戻る