Oracle PL/SQLIF语句、游标和记录集。使用游标后如何使用IF语句?
我想知道我的做法是否正确。 编译器给出的主要问题是针对这一行 如果从works中选择1,其中works.manager\u name中有一个\u employee.employee\u名称,则 错误17,8:PLS-00103:在预期以下情况之一时遇到符号SELECT:-+case mod new not null continue avg count current exists max min PREVICE sql STDEV sum variance forall merge time timestamp interval date pipe执行所有合并时间时间时间戳间隔日期管道 我想做的是使用一个光标来检测第一个条件,如果他们在该城市的一家公司工作。在我表格中的这个例子中,它将给出2家公司,以及大约7或8名员工。然后我把它放入变量an_employee中。我试图做的是使用该员工,然后从我的manages表中查看他们是否是经理,该表有多个行/元组。不是每个人都是经理。如何查看我的员工姓名是否在经理姓名列表中 我是否为管理器声明另一个游标,然后执行嵌套循环? 我是否可以使用现有游标并执行select查询以从表manages.manager\u name中获取经理列表?如果我这样做,我如何在If语句中使用它作为我的条件Oracle PL/SQLIF语句、游标和记录集。使用游标后如何使用IF语句?,oracle,plsql,Oracle,Plsql,我想知道我的做法是否正确。 编译器给出的主要问题是针对这一行 如果从works中选择1,其中works.manager\u name中有一个\u employee.employee\u名称,则 错误17,8:PLS-00103:在预期以下情况之一时遇到符号SELECT:-+case mod new not null continue avg count current exists max min PREVICE sql STDEV sum variance forall merge time
-- 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 If在逻辑条件下工作,不支持条件中的Select语句 您需要像这样重新编写代码
SELECT count(*)
INTO v_value
FROM works
WHERE an_employee.employee_name = works.manager_name;
IF v_value = 1 THEN
--do some stuff
ELSE
--do some other stuff
END IF;
你的问题与昨天公布的问题基本相同。PL/SQL需要的是布尔表达式,而不是布尔表达式 一个好的做法是将查询封装到返回适当值的函数中 例如: 运行示例:
如果我正确理解了你的问题,那么你是在试图根据计算的工资确定员工是否是经理。希望下面的代码片段能有所帮助
CREATE OR REPLACE PROCEDURE give_raises(
X company.city%TYPE,
Y NUMBER,
Z NUMBER)
AS
managers PLS_INTEGER;
BEGIN
FOR an_employee IN
(SELECT works.employee_name
FROM works
WHERE works.company_name IN
(SELECT company_name FROM company WHERE city = 'London'
)
)
LOOP
SELECT COUNT(1)
INTO managers
FROM manages m
WHERE m.manager_name = an_employee.employee_name;
-- is a manager give Y percent raise
IF managers <> 0 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;
END;
谢谢你,很有帮助。我要去做这件事。是的,这更有意义,哈哈
SQL> @so53.sql
1:X
1:not Y
2:X
2:not Y
PL/SQL procedure successfully completed.
SQL>
CREATE OR REPLACE PROCEDURE give_raises(
X company.city%TYPE,
Y NUMBER,
Z NUMBER)
AS
managers PLS_INTEGER;
BEGIN
FOR an_employee IN
(SELECT works.employee_name
FROM works
WHERE works.company_name IN
(SELECT company_name FROM company WHERE city = 'London'
)
)
LOOP
SELECT COUNT(1)
INTO managers
FROM manages m
WHERE m.manager_name = an_employee.employee_name;
-- is a manager give Y percent raise
IF managers <> 0 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;
END;