oracleサンプルプログラム

ストアドプロシージャ(PL/SQL)でもオーバーロードできます

パッケージのヘッダー部に同一名のプロシージャ、ファンクションをパラメータを変えて複数定義する事で実現できます。

ヘッダー部
CREATE OR REPLACE PACKAGE SCOTT."PAC01"
IS
PROCEDURE PRC_OLTEST  (P_NAME IN VARCHAR2);
PROCEDURE PRC_OLTEST  (P_NAME IN VARCHAR2,P_NO IN NUMBER);
PROCEDURE PRC_OLTEST  (P_NAME IN VARCHAR2,P_NO IN NUMBER,P_RCODE OUT NUMBER) ;

FUNCTION FNC_OLTEST (P_NO IN NUMBER ) RETURN VARCHAR2;
FUNCTION FNC_OLTEST (P_NO IN VARCHAR2) RETURN NUMBER;
FUNCTION FNC_OLTEST (P_NO IN NUMBER ,P_NAME IN VARCHAR2 ) RETURN NUMBER;
END;
/
ボディ部
CREATE OR REPLACE PACKAGE BODY SCOTT."PAC01" AS

PROCEDURE PRC_OLTEST 
(
 P_NAME    IN  VARCHAR2
)
IS
vPRC_NAME  CONSTANT VARCHAR2(80)  := 'PRC_OLTEST(P_NAME IN VARCHAR2)';
BEGIN
    DBMS_OUTPUT.PUT_LINE('実行プロシージャ:'||vPRC_NAME);
    DBMS_OUTPUT.PUT_LINE('P_NAME IN :'||P_NAME);
END PRC_OLTEST;

/*
 * 
 */
PROCEDURE PRC_OLTEST 
(
 P_NAME   IN  VARCHAR2
,P_NO     IN  NUMBER
)
IS
vPRC_NAME CONSTANT VARCHAR2(80)  := 'PRC_OLTEST(P_NAME IN VARCHAR2,P_NO IN  NUMBER)';

BEGIN
    DBMS_OUTPUT.PUT_LINE('実行プロシージャ:'||vPRC_NAME);
    DBMS_OUTPUT.PUT_LINE('P_NAME IN :'||P_NAME);
    DBMS_OUTPUT.PUT_LINE('P_NO   IN :'||to_char(P_NO));
END PRC_OLTEST;

/*
 * 
 */
PROCEDURE PRC_OLTEST 
(
 P_NAME   IN  VARCHAR2
,P_NO     IN  NUMBER
,P_RCODE OUT  NUMBER
)
IS
vPRC_NAME CONSTANT VARCHAR2(80)  := 'PRC_OLTEST(P_NAME IN VARCHAR2,P_NO IN  NUMBER,P_RCODE OUT  NUMBER)';
vRCODE  NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('実行プロシージャ:'||vPRC_NAME);
    DBMS_OUTPUT.PUT_LINE('P_NAME  IN  :'||P_NAME);
    DBMS_OUTPUT.PUT_LINE('P_NO    IN  :'||to_char(P_NO));
    vRCODE := P_NO * P_NO;
    DBMS_OUTPUT.PUT_LINE('P_RCODE OUT :'||to_char(vRCODE));
END PRC_OLTEST;

/*
 * 
 */
FUNCTION FNC_OLTEST (
    P_NO IN NUMBER 
) RETURN VARCHAR2
is
rdate EX01.C2%TYPE;
BEGIN
    select c2 into  rdate from ex01 where c1 = P_NO;
    return rdate;
END;

/*
 * 
 */
FUNCTION FNC_OLTEST (
    P_NO IN VARCHAR2 
) RETURN NUMBER
is
rdate EX01.C1%TYPE;
BEGIN
    select c1 into  rdate from ex01 where c2 = P_NO;
    return rdate;
END;

/*
 * 
 */
FUNCTION FNC_OLTEST (
    P_NO   IN NUMBER 
   ,P_NAME IN VARCHAR2
) RETURN NUMBER
is
rdate EX01.C3%TYPE;
BEGIN
    select c3 into  rdate from ex01 where c1 = P_NO and c2 = P_NAME;
    return rdate;
END;

END PAC01;
実行結果
-- ファンクションの実行
select PAC01.FNC_OLTEST(1) from dual
;
select PAC01.FNC_OLTEST('みかん') code from dual
;
select PAC01.FNC_OLTEST(1,'みかん') price from dual
;

-- プロシージャの実行
exec PAC01.PRC_OLTEST('テスト1')
;
exec PAC01.PRC_OLTEST('テスト2',60)
;
-- OUTパラメータの場合は無名ブロックで呼び出さないといけません
declare
vRCODE number;
begin
PAC01.PRC_OLTEST('テスト3',45,vRCODE);
DBMS_OUTPUT.PUT_LINE('vRCODE :'||to_char(vRCODE));
end;
スポンサーリンク
タイトルとURLをコピーしました