56/125 Oracle PLSQL: Working with Packages / Forward Declaration

preview_player
Показать описание
Learn Oracle PLSQL
EXAM 1Z0-144

---------------------------------------------------------------------
create or replace package proc_rules_calling
is
procedure print_emp_details
(p_emp_id number);
end;

create or replace package body proc_rules_calling
is
function get_no_work_days (p_emp_id number)
return number
is
v_hiredate date;
begin
select HIRE_DATE into v_hiredate
from employees
where EMPLOYEE_ID=p_emp_id;
return round(sysdate-v_hiredate);
end;

procedure print_emp_details
(p_emp_id number)
is
-- we will call the funcion from this procedure
--so it should be defined above in order to invoke it
v_details employees%rowtype;
begin
select * into v_details
from employees
where EMPLOYEE_ID=p_emp_id;
end;

end;

------------------------------------------------------------------------------

--same example but we will change the order
create or replace package proc_rules_calling
is
procedure print_emp_details
(p_emp_id number);
end;

--it will give error
--'GET_NO_WORK_DAYS' not declared in this scope
create or replace package body proc_rules_calling
is

procedure print_emp_details
(p_emp_id number)
is
v_details employees%rowtype;
begin
select * into v_details
from employees
where EMPLOYEE_ID=p_emp_id;
end;

function get_no_work_days (p_emp_id number)
return number
is
v_hiredate date;
begin
select HIRE_DATE into v_hiredate
from employees
where EMPLOYEE_ID=p_emp_id;
return round(sysdate-v_hiredate);
end;

end;
------------------------------------------------------------------
--the solution is to do forward declaration
drop package proc_rules_calling;

create or replace package proc_rules_calling
is
procedure print_emp_details
(p_emp_id number);
end;

create or replace package body proc_rules_calling
is
function get_no_work_days (p_emp_id number)
return number; -- we put the function specification only

procedure print_emp_details
(p_emp_id number)
is
-- we will call the funcion from this procedure
--so it should be defined above in order to invoke it
v_details employees%rowtype;
begin
select * into v_details
from employees
where EMPLOYEE_ID=p_emp_id;
end;

function get_no_work_days (p_emp_id number)
return number
is
v_hiredate date;
begin
select HIRE_DATE into v_hiredate
from employees
where EMPLOYEE_ID=p_emp_id;
return round(sysdate-v_hiredate);
end;

end;

Рекомендации по теме
Комментарии
Автор

انا كتير بعكس زي ما حضرتك عامل في المثال بمعني اني بستخدم function من قبل ما اعرفه في ال package body وعمري ما استخدمت طريقه ال forward ولم تحدث مشكله معي.. قد يكون السبب اني بعرف الفانكشن في ال package specification?
وقد يكون دي طريقه مختلفه لل forward

Egytut