if(从表中选择count(列))> 0然后

时间:2012-04-17 22:44:14

标签: oracle plsql

我需要检查一下情况。即:

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

3 个答案:

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