使用 select 语句更新记录

Update records with a select statement

我有一个带有 v_emp_id 和 v_in_term 变量的游标。我需要根据此人是否在特定查询中为每条记录分配 v_in_term 是或否值。我无法将员工 table 加入到我的游标查询中。它的一般逻辑是这样的:

if v_emp_id in (select emp_id from employees)  
then v_in_term := 'Yes';                        
else v_in_term := 'No'; 
end if;

它说我不能在这里使用查询。我该如何更改?

[错误] 编译 (906: 42): PLS-00405: 在此上下文中不允许子查询

您不能在 PL/SQL IF 语句中将 IN 与子查询(或 EXISTS)一起使用。相反,您可以使用 SELECT ... INTO 和您的查询:

DECLARE
  v_emp_id  EMPLOYEES.EMP_ID%TYPE := 1;
  v_in_term VARCHAR2(3);
BEGIN
  SELECT CASE
         WHEN v_emp_id in (select emp_id from employees)
         THEN 'Yes'
         ELSE 'No'
         END
  INTO   v_in_term
  FROM   DUAL;
  
  DBMS_OUTPUT.PUT_LINE(v_in_term);
END;
/

EXISTS:

DECLARE
  v_emp_id  EMPLOYEES.EMP_ID%TYPE := 1;
  v_in_term VARCHAR2(3);
BEGIN
  SELECT CASE
         WHEN EXISTS(SELECT 1 FROM employees WHERE emp_id = v_emp_id)
         THEN 'Yes'
         ELSE 'No'
         END
  INTO   v_in_term
  FROM   DUAL;
  
  DBMS_OUTPUT.PUT_LINE(v_in_term);
END;
/

db<>fiddle here

更紧凑的方法是使用 count(*)

declare
  v_emp_id  EMP.EMP_ID%TYPE := 2;
  v_in_term VARCHAR2(3);
begin
  select decode(count(*),0,'no','yes') into v_in_term from emp
  where emp_id = v_emp_id;
  dbms_output.put_line(v_in_term); 
end;
/

count(*) returns zero 如果在 table 中没有找到记录,则映射到 no decode。所有其他结果都映射到 yes,因此即使在您不检查 主键 ..

的情况下它也能正常工作