「Oracle」ストアドプロシージャを作成してみる

Oracle Database のストアドプロシージャの作成をやってみたので、メモしておきます。
データベース屋ではないので必須知識ではないのですが、簡単なレベルであれば自分でできた方がいいだろうということで、やってみた次第です。

1. テスト用テーブルの作成


カラムが id と name だけの簡単なテーブルにしました。

create table t1 (id number(10), name varchar(10), primary key (id));

データもつっこんでおきます。

insert into t1 values (1, 'aaa');
insert into t1 values (2, 'bbb');
insert into t1 values (3, 'ccc');
insert into t1 values (4, 'aaa');
commit;


2. ストアドプロシージャの作成 ( パッケージなし )


上記のテーブル t1 のデータを取得 ( 条件は id ) するストアドプロシージャになります。

create or replace procedure select_t1_1 (aa in number, bb out number, cc out varchar) as
  begin
    select id, name into bb, cc from t1 where id = aa;
    dbms_output.put_line('id:' || bb);
    dbms_output.put_line('name:' || cc);
  end;
/

実行は以下の感じで。

set serveroutput on
variable bb number;
variable cc varchar2(10);
execute select_t1_1(1, :bb, :cc)

※ 実行結果

id:1
name:aaa


3. ストアドプロシージャの作成 ( パッケージあり )


パッケージも使えるみたいなので、これもやってみました。パッケージ使う利点は以下のドキュメントに情報ありました。

PL/SQLパッケージ
http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/packages.htm#i2408

パッケージ仕様部と本体をそれぞれ作成するみたいです。
■ 仕様部

create or replace package aaa as
  procedure select_t1_2 (aa in number, bb out number, cc out varchar);
end aaa;
/

■ 本体

create or replace package body aaa as
  procedure select_t1_2 (aa in number, bb out number, cc out varchar) is
  begin
    select id, name into bb, cc from t1 where id = aa;
    dbms_output.put_line('id:' || bb);
    dbms_output.put_line('name:' || cc);
  end;
end aaa;
/

実行は以下の感じ ( プロシージャ名をパッケージ名で修飾する )

set serveroutput on
variable bb number;
variable cc varchar2(10);
execute aaa.select_t1_2(1, :bb, :cc)

※ 実行結果

id:1
name:aaa


以上です。

・ストアドPL/SQLユニット用のSQL
http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/sqlstatements.htm
・CREATE PROCEDURE文
http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/create_procedure.htm#i2072424
・CREATE PACKAGE文
http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/create_package.htm#i2091914
・CREATE PACKAGE BODY文
http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/create_package_body.htm#i2065383

[ 環境情報 ]
CentOS 5.5
Oracle Database 11g Release 2 ( 11.2.0.1.0 )