而不是:
select count(*) into l_count from mergetest where a = 1;
case l_count
when 0 then
insert into mergetest (a,b) values (1,1);
when 1 then
update mergetest set b = b + 1 where a = 1;
else
NULL;
end case;
我想摆脱局部变量l_count
,而是做:
case select count(*) from mergetest where a = 1;
...
这可能吗?
答案 0 :(得分:1)
不,这是不可能的。它与PL / SQL的CASE 控制结构无关,而是与PL / SQL有关。您也不能在IF语句中使用它。
所以这段代码也不会编译:
IF (SELECT COUNT(*) FROM MY_TABLE) > 0 THEN ...
请注意,如果CASE语句是SELECT(或类似SQL)语句中的表达式,则可以使用子查询:
SEELCT
p.name,
CASE WHEN P.TYPE_ID = 1 THEN
(SELECT COUNT(*) FROM child c WHERE c.parent_id = p.id)
ELSE 0
END cnt
FROM parent p;
但是,当然,在表达式中,您不能使用诸如INSERT或UPDATE之类的语句。
答案 1 :(得分:1)
使用merge
而不是case
来摆脱局部变量是可能的:
merge into mergetest
using (select 1 a from dual) ins
on (mergetest.a = ins.a)
when matched then
update set mergetest.b = mergetest.b + 1
where (select count(1) from mergetest where mergetest.a = ins.a) = 1
when not matched then insert (mergetest.a, mergetest.b)
values (ins.a, 1)
行:
where (select count(1) from mergetest where mergetest.a = ins.a) = 1
如果表中已存在a
多次,则会阻止更新。
答案 2 :(得分:0)
似乎无法使用PL/SQL
来自doc
简单CASE中CASE操作数和WHEN操作数的值 statement可以是除BLOB,BFILE之外的任何PL / SQL类型的对象 类型,PL / SQL记录,索引表,varray或嵌套表。
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm
但是,您可以使用scalar subquery
select case when dummy = 'X' then (select count(*) from all_users)
else (select count(*) from dual)
end cnt from dual
这可能会解决您的问题。