SAK 図書館
Oracle PL/SQL 編18 - パッケージサブプログラムオーバーロード、package
■パッケージサブプログラムオーバーロード
・PL/SQL ではストアドファンクション、ストアドプロシジャに対する引数タ
イプが厳密であり、VB のように any 指定を使用するわけにはいかない。
また、引数のタイプチェックは実際にストアドが実行される前に評価される
ので、例外処理を記述することもできない。
このような場合、サブプログラムのオーバーロードを使用すると便利である。
オーバロードでは、異なる引数タイプや引数の数に対処可能である。
但し、in para を out para のようにするオーバーロードは使用できない。
この手のものは、in out para としておけば済むことなので問題はない。
・サブプログラムのオーバーロードは、同一のファンクション名、プロシジャ
名で複数の関数を記述することで実現する。
実際に引数タイプ毎に処理を複数用意するのは馬鹿げているので、共通処理
部分はプライベート関数として別に用意しておき、各オーバーロード関数か
ら呼び出すようにすると良い。
次のサンプルでは、function Test0 が共通処理のプライベート関数である。
Test1 は、5 つのオーバーロード関数を定義し、それぞれ共通関数 Test0
を呼び出している。
尚、どのオーバロードが使用されるかは、自動的に判断される。
/*
========================================================================
テストパッケージ仕様
========================================================================
*/
create or replace package test is
function Test1(p1 in varchar2) return varchar2;
function Test1(p1 in number) return varchar2;
function Test1(p1 in date) return varchar2;
function Test1(p1 in varchar2, p2 in varchar2) return number;
procedure Test1(p1 in varchar2);
end;
/
/*
========================================================================
テストパッケージ本体
========================================================================
*/
create or replace package body test is
/*
======================================================================
テスト共通ファンクション
======================================================================
*/
function Test0(p1 in varchar2, p2 in varchar2) return varchar2 is
begin
dbms_output.put_line('para1 = ' || p1);
dbms_output.put_line('para1 = ' || p2);
return p1 || p2;
end;
/*
======================================================================
テスト1 ファンクション - 1
======================================================================
*/
function Test1(p1 in varchar2) return varchar2 is
begin
dbms_output.put_line('Test1 - 1 varchar2 実行');
return Test0(p1, '');
end;
/*
======================================================================
テスト1 ファンクション - 2
======================================================================
*/
function Test1(p1 in number) return varchar2 is
begin
dbms_output.put_line('Test1 - 2 number 実行');
return Test0(to_char(p1), '');
end;
/*
======================================================================
テスト1 ファンクション - 3
======================================================================
*/
function Test1(p1 in date) return varchar2 is
begin
dbms_output.put_line('Test1 - 3 date 実行');
return Test0(to_char(p1, 'yyyy.mm.dd'), '');
end;
/*
======================================================================
テスト1 ファンクション - 4
======================================================================
*/
function Test1(p1 in varchar2, p2 in varchar2) return number is
begin
dbms_output.put_line('Test1 - 4 varchar2 実行');
return to_number(Test0(p1, p2));
end;
/*
======================================================================
テスト1 プロシジャ - 5
======================================================================
*/
procedure Test1(p1 in varchar2) is
a varchar2(2000);
begin
dbms_output.put_line('Test1 - 5 varchar2 実行');
a := Test0(p1, '');
end;
end;
/
■オーバーロード処理テスト
-- Test1 - 1 varchar2 テスト
set serveroutput on;
variable rcd varchar2(200);
execute :rcd := test.test1('aaa');
print rcd;
-- Test1 - 2 number テスト
set serveroutput on;
variable rcd varchar2(200);
execute :rcd := test.test1(100);
print rcd;
-- Test1 - 3 date テスト
set serveroutput on;
variable rcd varchar2(200);
execute :rcd := test.test1(sysdate);
print rcd;
-- Test1 - 4 varchar2 テスト
set serveroutput on;
variable rcd varchar2(200);
execute :rcd := test.test1('123', '456');
print rcd;
-- Test1 - 5 varchar2 テスト
set serveroutput on;
execute test.test1('123');
■Oracle PL/SQL 編資料
■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料