使用 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
,因此即使在您不检查 主键 ..
的情况下它也能正常工作
我有一个带有 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
,因此即使在您不检查 主键 ..