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