Oracle PL/SQLIF语句、游标和记录集。使用游标后如何使用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

我想知道我的做法是否正确。 编译器给出的主要问题是针对这一行 如果从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语句中使用它作为我的条件

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