ここから本文です

Oracle sql developer パッケージについて

アバター

ID非公開さん

2012/11/1820:41:56

Oracle sql developer パッケージについて

従業員IDを入力してFH999999という値だったら、ファンクションで勤続月数を計算し、
山田太郎の勤続月数は~です。と表示するプログラムを作成したいです。
なお、FH999999、山田太郎はsql plus上でfh_empテーブルにinsertしました。

コンパイルも通り、基本的にはうまくいっていると思うのですが、
sql plus上でselect pkg_package_.fun_func_(enter_comp_day)
from fh_emp where emp_id = 'FH999999';

と入力すると、年は-4713と9999の間の0以外の数字を指定する必要があります。
と言われてしまいます。
怪しいのはファンクション内の処理なのですが…
当方初心者なため、なかなかうまくいかず困っております。
何かお気づきの点があればご指摘頂きたいと思い、投稿させて頂きました。

--パッケージ仕様部
CREATE OR REPLACE PACKAGE pkg_package_ AS
FUNCTION fun_func_(id_enter_comp_day IN DATE) RETURN NUMBER;
PROCEDURE pro_user_expt_(iv_emp_id IN VARCHAR2);
END;
/

--パッケージ本体部
CREATE OR REPLACE PACKAGE BODY pkg_package_ AS
ld_enter_comp_day DATE;

--ファンクション
FUNCTION fun_func_(id_enter_comp_day IN DATE) RETURN NUMBER
IS
ln_work_cont_years NUMBER;
ld_work_cont_years DATE;

BEGIN

ld_work_cont_years := to_date('id_enter_comp_day','yyyymmdd');

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

RETURN ln_work_cont_years;
END fun_func_;

--プロシージャ
PROCEDURE pro_user_expt_(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;

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

ln_work_cont_years := fun_func_(ld_enter_comp_day);

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 pro_user_expt_;

END pkg_package_;

fh_empテーブルはsql plus上でemp_idにFH999999、emp_nameに山田太郎を挿入した状態で、
dept_id、enter_comp_dayにはnullを挿入しておきました。
それ以外は特に何も記述しておりません。

どなたかよろしくお願い致します。

閲覧数:
440
回答数:
2

違反報告

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

sun********さん

2012/11/1821:32:09

fun_func_ の

ld_work_cont_years := to_date('id_enter_comp_day','yyyymmdd');



ld_work_cont_years := to_date(id_enter_comp_day,'yyyymmdd');

とすればよいのでは。
SQL*Plusで、&をつけて変数を埋め込むのとは違うので、変数を ' で囲む必要はありません。

アバター

質問した人からのコメント

2012/11/19 21:22:16

ありがとうございます。to_dateを使う際にいつも'をつけていたので勘違いしてしまいました。ya_ma_da_gさんにも感謝したいです。お二人ともありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

ya_********さん

2012/11/1909:15:15

エラーの原因は既に回答されているとおりですが、
そもそも id_enter_comp_day はDATE型なのでto_date()する必要がありません。

あわせて知りたい

この質問につけられたタグ

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

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

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

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

閉じる

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

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

閉じる