我需要检查一下情况。即:
if (condition)> 0 then
update table
else do not update
end if
我是否需要使用select into?
将结果存储到变量中e.g:
declare valucount integer
begin
select count(column) into valuecount from table
end
if valuecount > o then
update table
else do
not update
答案 0 :(得分:37)
是的,您必须使用变量。您不能在PL / SQL表达式中直接使用SQL语句:
SQL> begin
2 if (select count(*) from dual) >= 1 then
3 null;
4 end if;
5 end;
6 /
if (select count(*) from dual) >= 1 then
*
ERROR at line 2:
ORA-06550: line 2, column 6:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:
...
...
相反,你必须做这样的事情:
SQL> set serveroutput on
SQL>
SQL> declare
2 v_count number;
3 begin
4 select count(*) into v_count from dual;
5
6 if v_count >= 1 then
7 dbms_output.put_line('Pass');
8 end if;
9 end;
10 /
Pass
PL/SQL procedure successfully completed.
当然,您可以在SQL中完成所有工作:
update my_table
set x = y
where (select count(*) from other_table) >= 1;
很难证明某些事情是不可能的。除了上面的简单测试用例,您可以查看IF
语句的syntax diagram;你不会在任何一个分支中看到SELECT
语句。
答案 1 :(得分:3)
当提供这个答案时,oracle标签不在问题上,显然它不适用于oracle,但它至少可以与postgres和mysql一起使用
不,只需直接使用该值:
begin
if (select count(*) from table) > 0 then
update table
end if;
end;
请注意,不需要“其他”。
你可以在更新语句中完成所有(即没有if
构造):
update table
set ...
where ...
and exists (select 'x' from table where ...)
答案 2 :(得分:1)
不太优雅,但是您不需要声明任何变量:
for k in (select max(1) from table where 1 = 1) loop
update x where column = value;
end loop;