UPDATE CLMS01.cvsobjcmminfo A SET
(A.GAGENM     ,
 A.PLIMORCUSID,
 A.PLIMCUSNM  ,
 A.PLIMORTYP  ,
 A.GAGEBIG    ,
 A.GAGESUBTYP ,
 A.GAGEFNS    ,
 A.PLESTS     ,
 A.GAGELOCPRO ,
 A.GAGELOCCIT ,
 A.GAGELOCBOR ,
 A.GAGELOCSTR 
) = (SELECT  B.PLENM,
              TO_CHAR(C.RELATIONID) ,                  D.GUAIMPPSNNM,
              D.PLIMORTYP,
              B.PLEBIG,
              B.PLESUBTYP,
              B.PLEFNS,
              B.PLESTS,
              B.GAGESEATOMIT,
              B.GAGESEATCITY,
              B.GAGESEATSECT,
       B.GAGESEATSTRT  
  FROM CCMSBAT.BLDITYP_GAGE_OBJ_INFO B,CLMS01.CUSPER C,CLMS01.CVSGAGEBASINFO D,CLMS01.cvsobjcmminfo A
      WHERE A.GAGENO = B.GAGENO AND A.GAGESN = B.GAGESN AND D.GAGENO = B.GAGENO
           AND C.CUSTOMERCODE = D.GUAIMPPSNCUSNO AND D.PLIMORTYP = '01'
           AND B.RGNCDE = '40004');更新记录集的时候,我在plsql developer 中执行sql时报:single-row subquery returns more than one row,可是我写在存储过程中用命令执行时,又没报这个错,报invalid character,不知道怎么回事!高人指点一下,我查不出问题了,谢谢哈!

解决方案 »

  1.   

    返回大于一行的数据 update失败了,检查你的select语句吧
      

  2.   

    本来就是返回的多行数据啊,是个记录集,我是想批量update啊,就像insert时批量insert一样,该怎么写呢?而且我其他的存储过程中也有这样写的,执行就成功了,不知道为什么这个会这样
      

  3.   

    语法错了
    update 数据表
    set 字段名1=(select 字段 or 运算 from 数据表 where 条件),字段2=(select 字段 or 运算 from 数据表 where 条件)......需要1个字段1个字段的写
      

  4.   

    是的,UPDATE语句你如果想批量,就用BATCH,如果SELECT出来的结果集返回数据超过1条是会报single-row subquery returns more than one row错误
      

  5.   

    create table t1 (aid varchar2(100));
    create table t3 (aid varchar2(100));insert into t1 values('1');
    insert into t3 values('1');
    insert into t3 values('1');
    update t1 set (aid)=(select aid from t3 where t1.aid=t3.aid)
    注意t3两条同样的记录与t1进行关联,你测试一下看看是不是就是你的问题ORA-01427 单行子查询返回多于一行
      

  6.   

    我又说错话了,以前还没这样用过了!
    update table
    set (n个字段)
    =(select n个字段 from table2)
    where 条件
    学习
      

  7.   

    写游标当然是可以的,可是游标的话效率会比较低,得一条条处理,如果数据量由几百万条的话恐怕不行哦,我原来就是用游标写的,我们头儿说这样不行,这不我才修改程序嘛,改成批量处理了,真不习惯啊,感觉oracle语法太灵活,有时候不知所措!
    我好像知道问题所在了:我没有在update时加限制条件,比如目标表原来有100条记录,我查出来的记录集是10条的话,那么必须通过where匹配出要更新的那十条才行,否则,他会update所有的,默认字段全为空,如果有非空限制就会出错,不知是否在理