sql 语句大概是(我已经作了简化) update (select c.c1, c.c2 cc2, c.c3 cc3, c.c4 cc4 from c) set c1 = c1 + ( select nvl(sum(p.p1),0) from p where p.p2 = cc2 and p.p3 = cc3 and p.p4=cc4 ); 将其直接在sqlplus中执行 成功 如果写成plsql ,(加上begin...end)则执行失败我的store procedure 都是写在package 中的。
我试了一下,看来是不行,ORACLE的解释是使用了不适当的语法单位。 这样写是可以的: update (select c.c1, c.c2 cc2, c.c3 cc3, c.c4 cc4 from c) set c1 = c1 + 表达式);看来在PL/SQL语句里编译不了这么复杂的语句。
用ORACLE自己的PACKAGE:DBMS_SQL应该能执行所有的SQL语句.
oracle的嵌套查询能力确实不敢恭维。以前写pl/sql的时候,还碰到一个恶心的问题,就是一种类型的嵌套查询过后出错,end of communication channel,出错信息大概是这个样子的,当前session就这么断了。各位,还有谁碰到了?就在oracle 8.1.5上。8.0.5没事。8i的后继版本没试过。:)
update
(select c.c1, c.c2 cc2, c.c3 cc3, c.c4 cc4 from c)
set c1 = c1 +
(
select nvl(sum(p.p1),0)
from p where p.p2 = cc2 and p.p3 = cc3 and p.p4=cc4
);
将其直接在sqlplus中执行 成功
如果写成plsql ,(加上begin...end)则执行失败我的store procedure 都是写在package 中的。
这样写是可以的:
update
(select c.c1, c.c2 cc2, c.c3 cc3, c.c4 cc4 from c)
set c1 = c1 + 表达式);看来在PL/SQL语句里编译不了这么复杂的语句。