sql oracle 程序 select

sql oracle procedures with select

我在使用 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;

它 returns 我是 PLS-00103 错误 而且我真的不认为我需要这两个字符串

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

我尝试使用

DECLARE emp_years in NUMBER;

但是也不行

你的程序有几处错误

  • 在DBMS_OUTPUT.PUT_LINE中你必须添加;(终止符)否则你会出错。
  • 在 select 中您必须添加 into 而不是 in
  • 在该过程中,您不必指定 varchar2 的长度。
  • 在条件中,为什么要添加日期条件?你想要员工的总年份
  • 您需要从 select 中的名称中得到什么,您已经有了它。
  • if条件下,30是什么意思?我指定如果员工超过一年,那么我们将有一个 dbms 输出

这是最后的程序

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

非常感谢@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;

所以你只需写下员工的姓名和程序 returns 他工作的年限

begin
check_emp ('Philip');
end;