【发布时间】:2016-04-01 15:39:04
【问题描述】:
我想知道我是否以正确的方式解决这个问题。
编译器给出的主要问题是这一行
IF SELECT 1 FROM works WHERE an_employee.employee_name IN works.manager_name THEN
错误(17,8):PLS-00103:在预期以下情况之一时遇到符号“SELECT”:(-+ case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge时间 时间戳 间隔 日期 管道
如果他们在该城市的公司工作,我想要做的是使用一个光标来检测第一个条件。在我的表格中的这个例子中,它将给出 2 家公司和大约 7 或 8 名员工。然后我把它放到我的变量 an_employee 中。我要做的是使用该员工然后查看他们是否是我的管理表中的经理,该表具有多行/元组。不是每个人都是经理。如何查看我的employee_name 是否在manager_name 列表中?
我是否为经理声明另一个游标,然后执行嵌套循环?
我可以使用我现有的游标并执行选择查询以从表manages.manager_name 中获取经理列表吗?如果我这样做,我如何在 IF 语句中使用它作为我的条件?
-- Give all employees that work in a company located in city X
-- a Y percent raise if they are managers and
-- a Z percent raise if they are not a manager
-- X, Y, and Z will be the three parameters for the stored procedure.
-- Build / compile a stored procedure
CREATE OR REPLACE PROCEDURE give_raises(X company.city%TYPE, Y NUMBER, Z NUMBER) IS
an_employee works.employee_name%TYPE;
-- cursor declaration
cursor Cursor1 IS
select works.employee_name
from works
where works.company_name IN (select company_name from company where city = 'London');
BEGIN
SELECT manager_name INTO managers FROM manages;
OPEN Cursor1;
LOOP
FETCH Cursor1 INTO an_employee;
EXIT WHEN Cursor1%NOTFOUND;
-- is a manager give Y percent raise
IF SELECT 1 FROM works WHERE an_employee.employee_name IN works.manager_name THEN
update works
set works.salary = works.salary + (works.salary * Y)
where works.employee_name = an_employee.employee_name;
ELSE -- is not a manager give Z percent raise
update works
set works.salary = works.salary + (works.salary * Z)
where works.employee_name = an_employee.employee_name;
END IF;
END LOOP;
CLOSE Cursor1;
END;
你也应该知道。我正在使用 Oracle、Oracle Sql Developer 和 IDE。
【问题讨论】: