存储过程,用于获取所有员工的姓氏、部门编号和部门名称

  • 本文关键字:编号 获取 用于 存储过程 sql oracle
  • 更新时间 :
  • 英文 :


在隔间中,我需要编写一个存储过程,用于检索所有员工的姓氏、部门编号和零件名称。数据需要输出到光标才能打印到屏幕上。这句话怎么了?

create   or REPLACE procedure getempldept(
ed_emplid in employees.last_name%type,
ed_deptid in  employees.department_id%type,
ed_deptname in departments.department_name%type
)
is 
begin
select last_name,department_id,department_name into ed_emplid,ed_deptid,ed_deptname
from employees,departments
where department_id=ed_deptid;
commit;
end;

使用存储过程在屏幕上打印1994年雇佣的所有员工的姓氏和雇佣日期,并输入年度参数

create or REPLACE PROCEDURE  empl_get (
g_Emp  OUT SYS_REFCURSOR
)
begin
OPEN g_Emp FOR
select last_name, hire_date  from employees 
where TO_CHAR(employees.hire_date,'yyyy')>='2003';
end ;

好的,在格式化您放入注释的修改后的代码后,我们看到

CREATE OR replace PROCEDURE Getempldept( ed_emplname IN employees.last_name%TYPE,
ed_deptid    IN employees.department_id%TYPE,
ed_deptname  IN departments.department_name%TYPE )
IS
BEGIN
FOR empldeft IN getempldept
LOOP
SELECT empldeft.ed_emplname,
empldeft.ed_deptid,
empldeft.ed_deptname
FROM   employees,
departments
WHERE  department_id=ed_deptid;

dbms_output.Put_line ('Employename: '
|| empldeft.ed_emplname , ' departname:'
||empldeft.ed_deptid , 'departid :'
|| empldeft.ed_deptname );
END LOOP COMMIT;
END; 

所以让我问你:你有输入参数来提供一个员工id,一个部门名称和一个部门id;检索所有员工的姓氏、部门编号和部门名称"那么,您的输入参数将实现什么呢?记住,你说过">所有员工";。如果你真正想要的是某个部门的所有员工,那么你只需要输入部门id。

其次,当您在pl/sql中执行SELECT时,您必须提供一个放置结果的位置。这是通过添加INTO子句来完成的。查一下。

第三,什么是"empldeft"SELECT中列名的资格?什么是"empldeft"?您的桌子

第三,您的"CURSOR FOR LOOP"没有引用游标。它引用过程本身的名称。有两种方法可以实现CURSOR FOR LOOP。第一种方法是明确定义光标,然后引用它:

create or replace procedure getempldept (ed_deptid IN employees.department_id%TYPE)
is
cursor c1 is 
SELECT empldeft.ed_emplname,
empldeft.ed_deptid,
empldeft.ed_deptname
FROM   employees,
departments
WHERE  department_id=ed_deptid;

begin
for x in c1
loop
dbms_output.put_line ('Employename: '
|| empldeft.ed_emplname , ' departname:'
||empldeft.ed_deptid , 'departid :'
|| empldeft.ed_deptname );
END LOOP;
end;

但我更喜欢将查询放入循环定义中:

create or replace procedure getempldept (ed_deptid IN employees.department_id%TYPE)
is
begin
for x in (SELECT empldeft.ed_emplname,
empldeft.ed_deptid,
empldeft.ed_deptname
FROM   employees,
departments
WHERE  department_id=ed_deptid)
loop
dbms_output.put_line ('Employename: '
|| empldeft.ed_emplname , ' departname:'
||empldeft.ed_deptid , 'departid :'
|| empldeft.ed_deptname );
END LOOP;
end;

什么是"empldeft"SELECT中列名的资格?什么是"empldeft"?您的表名是EMPLOYEES和DEPARTMENTS。

不需要COMMIT。您尚未对COMMIT执行任何INSERT、UPDATE或DELETED操作。

在选择多个表时,您没有JOIN条件。

在您的输出中,您混合了部门名称和部门id的标签。

让我们再试一次。我不知道你的表,而且你似乎对从哪里来的内容感到非常困惑,我将使用与标准演示表一致的列名。

create or replace procedure getempldept (i_deptid IN employees.department_id%TYPE)
is
begin
for x in (SELECT e.employee_name,
D.dept_name
FROM   employees e
join departments d on e.dept_id = d.department_id
where d.dept_id = i_deptid)
loop
dbms_output.put_line ('Employename: '|| x.employee_name||
' departname: '|| x.dept_name ||
' dept_id   : '|| i_deptid
);
END LOOP;
end;

最新更新