Complex extended user-defined types
(decode the
code J)
DECLARE
/*
Simple type declaration
*/
    TYPE
BonusCompensation
      IS
RECORD (CashPayment    NUMBER(6),
                 CompanyCar     BOOLEAN,
                 VacationWeeks  NUMBER(2)
                  );
/*
Extended type declaration
*/
      TYPE
EmpRecord
      IS
RECORD  (ssn         
employee.ssn%TYPE,
                 LName         employee.LName%TYPE,
                 FNAME          employee.FName%TYPE,
                 DName         department.DName%TYPE,
                 BonusPayment  BonusCompensation
                  );
/*
Instance declaration
*/
    BestEmp  EmpRecord;
/*
Another extended type declaration along with instance
declaration.
*/
    TYPE
ManagerRecord
    IS
RECORD (Lname         employee.Lname%TYPE,
               ssn           employee.ssn%TYPE,
BonusPayment  BonusCompensation
               );
    BestManager  ManagerRecord;
BEGIN
/*
Less than meaningful logic to determine the employee who
should receive a
bonus. The main focus in this example is the ability to store
database values
within the record instance.
*/
  SELECT
essn, LName,Fname, DName
  INTO
BestEmp.ssn,
       BestEmp.LName,
       BestEmp.Fname,
       BestEmp.DName
  FROM
employee, department,
works_on
  WHERE
employee.dno =
department.dnumber
  AND
employee.ssn =
works_on.essn
  AND
hours = (SELECT MAX(hours) FROM works_on)
  AND
ROWNUM <= 1;
/*
The next segment of code accesses the values within the
record instance.
*/
  BestEmp.BonusPayment.CashPayment := 5000;
  BestEmp.BonusPayment.CompanyCar := TRUE;
  BestEmp.BonusPayment.VacationWeeks := 1;
  dbms_output.put_line ('Best employee Family name: ' ||
BestEmp.FName);
  dbms_output.put_line ('Best employee name: ' ||
BestEmp.LName);
  dbms_output.put_line ('Best employee department: ' ||
BestEmp.DName);
  dbms_output.put_line ('Best employee bonus payment: ' ||
                         BestEmp.BonusPayment.CashPayment);
  IF
BestEmp.BonusPayment.CompanyCar
= TRUE THEN
        dbms_output.put_line ('Company car also provided');
  END
IF;
  IF
BestEmp.BonusPayment.VacationWeeks
> 0 THEN
        dbms_output.put_line ('Extra vacation weeks
granted: ' ||
                             
BestEmp.BonusPayment.VacationWeeks);
  END
IF;
/*
A similar set of instructions uses the other record instance.
This is used to
perform similar logic for a manager who is selected for bonus
compensation.
*/
  SELECT
Lname,ssn
  INTO
BestManager.Lname,BestManager.ssn
  FROM
employee, department
  WHERE
employee.ssn =
department.MgrSSN
  AND
  ROWNUM <=
1;
  BestManager.BonusPayment.CashPayment := 10000;
  BestManager.BonusPayment.CompanyCar := TRUE;
  BestManager.BonusPayment.VacationWeeks := 2;
  dbms_output.put_line ('Best manager Name: ' ||
BestManager.Lname);
  dbms_output.put_line ('Best manager SSN: ' ||
BestManager.ssn);
  dbms_output.put_line ('Best manager bonus payment: ' ||
                         BestManager.BonusPayment.CashPayment);
  IF
BestManager.BonusPayment.CompanyCar = TRUE THEN
        dbms_output.put_line ('Company car also provided');
  END
IF;
  IF
BestManager.BonusPayment.VacationWeeks > 0 THEN
        dbms_output.put_line ('Extra vacation weeks
granted: ' ||
                             
BestManager.BonusPayment.VacationWeeks);
  END
IF;
END;
anonymous block completed
Best employee Family name: Bhutta
Best employee name: Ali
Best employee department: Operation
Best employee bonus payment: 5000
Company car also provided
Extra vacation weeks granted: 1
Best manager Name: Rafique
Best manager SSN: 333445555
Best manager bonus payment: 10000
Company car also provided
Extra vacation weeks granted: 2
 
No comments:
Post a Comment