Оракул процедуры с выбором - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть некоторые проблемы с процедурами, когда дело доходит до использования select

Мне нужна процедура, которая показывает мне опыт работы определенного сотрудника

Это выглядит так: я пишуимя этого сотрудника, и оно показывает мне годы

И я придумываю что-то вроде этого:

CREATE OR REPLACE PROCEDURE check_emp (fname in varchar2(20))
AS
emp_fname employee.fname%TYPE;
emp_hire_date employee.hire_date%TYPE;
BEGIN
select fname, hire_date in emp_fname, emp_hire_date FROM employee
where emp_fname = fname 
and emp_hire_date = months_between(sysdate, hire_date)/12;
if emp_hire_date > 30
then 
DBMS_OUTPUT.PUT_LINE (emp_fname ||'worked'||emp_hire_date||'years')
end if;
end;

Это возвращает мне ошибку PLS-00103 И также я действительно не думаю, что янужны эти две строки

emp_fname employee.fname%TYPE;
emp_hire_date employee.hire_date%TYPE;

И я пытался использовать

DECLARE emp_years in NUMBER;

Но это тоже не работает

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Большое спасибо @Moudiz за эту проблему, но я тоже отредактировал его код. Теперь он выглядит именно так, как мне нужно

CREATE OR REPLACE PROCEDURE check_emp (fnamee varchar2)
AS
emp_fname VARCHAR2(100);
emp_hire_date number;
BEGIN
select fname, ROUND(months_between(sysdate, hire_date)/12) into  emp_fname,         
emp_hire_date FROM employee
where fname = fnamee;
if  emp_hire_date > 0
then
DBMS_OUTPUT.PUT_LINE (emp_fname ||' worked '||emp_hire_date||' years.');
end if;
end;

Итак, вы просто пишете имя сотрудника, и процедура возвращает суммулет он работал

begin
check_emp ('Philip');
end;
0 голосов
/ 10 декабря 2018

В процедуре

  • в DBMS_OUTPUT.PUT_LINE есть несколько неправильных вещей: вам нужно добавить ; (терминатор), иначе у вас будет ошибка.
  • в выбореВы должны добавить into вместо in.
  • в процедуре, в которой вам не нужно указывать длину varchar2.
  • в условии, почему вы добавляете условие даты?вам нужен год, в котором вы работаете,
  • что вам нужно от имени в выбранном вами, у вас уже есть.
  • в условии if, что вы подразумеваете под 30?Я уточнил, что если работник более года, то у нас будет вывод в дБм

Это последняя процедура

-- adding data
 insert into employee (FIRST_NAME,last_name,hire_date) values('Mike','WHITE' ,to_date('01/08/2015','DD/MM/YYYY'));
commit;

CREATE OR REPLACE PROCEDURE check_emp (fname varchar2)
AS
emp_fname VARCHAR2(100);
emp_hire_date number;
BEGIN

select ROUND(months_between(sysdate, hire_date)/12) into  emp_hire_date FROM employee
where FIRST_NAME = 'MIKE';
--and hire_date = sysdate - floor(months_between(sysdate, hire_date)/12);

if  emp_hire_date > 0
then
DBMS_OUTPUT.PUT_LINE (emp_fname ||' worked'||emp_hire_date||' years.');
end if;
end;
...