パッケージの作成方法
従業員マスタを対象にデータを取得するストアドとファンクションを作成しました。
仕様部
create or replace NONEDITIONABLE PACKAGE pkg_emp AS
--ファンクション
FUNCTION get_emp_no(NAME IN VARCHAR2) RETURN VARCHAR2;
--プロシージャ
PROCEDURE get_emp_name(NO IN VARCHAR2, NAME OUT VARCHAR2);
END;
本体部
create or replace NONEDITIONABLE PACKAGE BODY pkg_emp AS
FUNCTION get_emp_no(NAME IN VARCHAR2) RETURN VARCHAR2
-- 宣言部
IS
wk_no VARCHAR2(50);
-- 処理部
BEGIN
SELECT
EMPNO INTO wk_no
FROM EMP
WHERE EMPNAME = NAME;
RETURN wk_no;
END get_emp_no;
FUNCTION get_emp_gender(NAME IN VARCHAR2) RETURN NUMBER
-- 宣言部
IS
wk_gender NUMBER;
-- 処理部
BEGIN
SELECT
GENDER_F INTO wk_gender
FROM EMP
WHERE EMPNAME = NAME;
RETURN wk_gender;
END get_emp_gender;
PROCEDURE get_emp_name(NO IN VARCHAR2, NAME OUT VARCHAR2)
-- 宣言部
IS
wk_name VARCHAR2(50);
wk_no VARCHAR2(50);
wk_gender NUMBER;
-- 処理部
BEGIN
SELECT
EMPNAME INTO wk_name
FROM EMP
WHERE EMPNO = NO;
wk_no := get_emp_no(wk_name);
wk_gender := get_emp_gender(wk_name);
NAME := wk_name;
DBMS_OUTPUT.PUT_LINE(wk_gender);
DBMS_OUTPUT.PUT_LINE(wk_no);
DBMS_OUTPUT.PUT_LINE(NAME);
END get_emp_name;
END pkg_emp;
補足
以下の点に気を付けないとエラーに悩みます。
・仕様部で定義したストアドとファンクションの引数が本体部とも一致していること
・引数と同じ変数名を定義していないこと
・selectしてきた値と代入先の変数の型が一致していること
※仕様部と本体部のパッケージ作成は分けて実行したほうが良いです。
定義が重複しているエラーなのか、処理の記載ミスなのかの判断が遅くなります。