ここから本文です

oracle sql developer ファンクションについて

アバター

ID非公開さん

2012/11/121:47:34

oracle sql developer ファンクションについて

このプロシージャでの記述はsql plusで社員IDのFH99999が入力されると表に山田太郎の行を作り
値を挿入する、という形です。(エラー時の処理もあります。)

SQL plusでemp_idをFH99999に指定し、従業員の入社年月日を入力すると
現在の日付から入社年月日の値を引き、勤続月の値を出す計算をファンクションで行い、プロシージャに返すソースを書きたいです。

コンパイルエラーはありませんと言われますが、
show errorではエラーはありませんと言われてしまいます。
また、これらを1つのワークシートにまとめて書いていることが問題でしょうか。
どなたかご教示頂ければ幸いです。

CREATE OR REPLACE FUNCTION fun_func(
id_enter_comp_day IN NUMBER,
)

RETURN NUMBER
IS
ln_work_cont_years NUMBER;
BEGIN

ln_work_cont_years := TRUNC(MONTHS_BETWEEN(SYSDATE, id_enter_comp_day));

RETURN in_work_cont_years ;
END;
/
CREATE OR REPLACE
PROCEDURE pro_fun_func(iv_emp_id IN VARCHAR2)
IS
lv_emp_name fh_emp.emp_name%TYPE;
ld_enter_comp_day fh_emp.enter_comp_day%TYPE;
ln_work_cont_years NUMBER;
expt_null_check_error EXCEPTION;
expt_form_check_error EXCEPTION;

BEGIN

/*エラー処理*/

IF iv_emp_id IS NULL THEN
RAISE expt_null_check_error;
ELSIF SUBSTR(iv_emp_id,1,2) != 'FH' THEN
RAISE expt_form_check_error;
END IF;

INSERT INTO fh_emp VALUES ('FH99999','山田太郎',NULL,to_date('ld_enter_compday','yyyymmdd'));

SELECT emp_name,enter_comp_day INTO lv_emp_name,ld_enter_comp_day FROM fh_emp WHERE emp_id = iv_emp_id ;

DBMS_OUTPUT.PUT_LINE('['||lv_emp_name||']の勤務月数は['||ln_work_cont_years||']です。');

EXCEPTION
WHEN expt_null_check_error THEN
DBMS_OUTPUT.PUT_LINE('従業員IDを設定してください。');
WHEN expt_form_check_error THEN
DBMS_OUTPUT.PUT_LINE('従業員IDの形式が間違っています。形式:FH00000');
END;
/

表はこちら

CREATE TABLE fh_emp(
emp_id VARCHAR2(10) ,
emp_name VARCHAR2(50),
dept_id VARCHAR2(10),
enter_comp_day DATE
)

閲覧数:
594
回答数:
1

違反報告

ベストアンサーに選ばれた回答

sun********さん

2012/11/200:30:17

変数のスコープ、と言って意味わかりますか?

ln_work_cont_years の変数の値を、ストアドファンクションの定義中で計算している、というつもりなのかもしれませんが、ストアドファンクション中のln_work_cont_yearsとプロシジャ中のln_work_cont_yearsはたまたま名前が同じなだけの、全く別な変数です。
ファンクションを定義だけして使っていない状態で、プロシジャ内のln_work_cont_yearsには何も代入されていない状態です。
関数をコールし、戻り値を変数に設定してあげましょう。

ln_work_cont_years := fun_func(ld_enter_comp_day);

という一文を SELECT文と PUT_LINE文の間に入れてあげれば正しい結果が得られるのでは。

この回答は投票によってベストアンサーに選ばれました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる