0

まだ動作していない PL/SQL 用のプログラムがあり、動作に近づいていますが、どこが間違っているかを確認するための少しの助けが必要です。

現在、従業員テーブルから最も早く雇用された従業員を取得し、%ROWTYPE を使用してそれを RECORD に入力し、その情報をユーザーに表示するプログラムがあります。

すべてが順調に進んでおり、計画どおりですが、従業員の寿命の変数宣言に少し問題があります。sysdate からの最初の Hire_date 計算で結果が得られません。TRUNC(MONTHS_BETWEEN) 計算を使用し、それを宣言されたレコードに入れています。そのため、途中で変数または計算が機能していません。

とにかく、主な問題は LONGEVITY 計算が機能しないことにあります。これは単なる年齢計算です。これは私が得るべき形式と答えです

Longevity: 9113.5 days or 303.8 months

これが私のコーディングです。すべての変数、レコード、および宣言を基本的かつ単純にしようとしたため、少し複雑です。

SET SERVEROUTPUT ON
DECLARE
  TYPE hr_rec IS RECORD
    (
    hr_longevity        NUMBER(4, 1),
    hr_hire_date        employees.hire_date%TYPE,
    hr_rec_row          employees%ROWTYPE
    );
    hr_myrecord      hr_rec;

BEGIN

SELECT *  INTO hr_myrecord.hr_rec_row
 FROM
 (
     SELECT * 
     FROM  employees
     ORDER BY hire_date
 )
 WHERE rownum = 1;

hr_myrecord.hr_longevity := 
    TRUNC(MONTHS_BETWEEN(SYSDATE, hr_myrecord.hr_hire_date), 1);

DBMS_OUTPUT.PUT_LINE('The employee info for Longest Employed is: '
|| hr_myrecord.hr_rec_row.employee_id
|| '  ' || hr_myrecord.hr_rec_row.first_name 
||  '  ' || hr_myrecord.hr_rec_row.last_name );
DBMS_OUTPUT.PUT_LINE('Hire date is:  ' || hr_myrecord.hr_rec_row.hire_date);
DBMS_OUTPUT.PUT_LINE('Email address is:  ' || hr_myrecord.hr_rec_row.email);
DBMS_OUTPUT.PUT_LINE('Phone number is:  ' || hr_myrecord.hr_rec_row.phone_number);
DBMS_OUTPUT.PUT_LINE('Longevity is: ' || hr_myrecord.hr_longevity );
END;
/

ここにそれが私に与えるものがあります:

anonymous block completed
The employee info for Longest Employed is ID#:  100  Steven  King
Hire date is:  17-JUN-87
Email address is:  SKING
Phone number is:  515.123.4567
Longevity is: 

また、キックのために、これは私のテキストの例であり、この計算を取得するために使用することになっています。あまり役に立ちませんが、計算が異なるだけで似ています。

DECLARE
type t_rec is record
(v_sal number(8),
v_minsal number(8) default 1000,
v_hire_date employees.hire_date%type,
v_rec1 employees%rowtype);
v_myrec t_rec;
BEGIN
v_myrec.v_sal := v_myrec.v_minsal + 500;
v_myrec.v_hire_date := sysdate;
SELECT * INTO v_myrec.v_rec1
FROM employees WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE(v_myrec.v_rec1.last_name ||' '||
to_char(v_myrec.v_hire_date) ||' '|| to_char(v_myrec.v_sal));
END;
4

1 に答える 1

2

hr_myrecord.hr_hire_date計算前に初期化されhr_myrecord.hr_longevity
ません次のよう にすることができます。

hr_myrecord.hr_longevity := 
    TRUNC(MONTHS_BETWEEN(SYSDATE, hr_myrecord.hr_rec_row.hire_date), 1);
于 2013-02-19T07:33:04.550 に答える