我在做批量更新的时候,遇到这样的问题:
把生成的sql语句在PL/SQL中一条一条的执行,没有任何问题,可用批量更新就报"ora0091 invalid character",不知问题出在什么地方?代码如下:
=======================
  frm_pubKC.qry_User.First;
  while not frm_pubKC.qry_User.Eof do begin
    maxNum:=maxNum+1;
    i:=i+1;
    sSerialNum:=sSerial+copy('000000',1,6-length(inttostr(maxNum)))+inttostr(maxNum);
    sUserID:=frm_pubKC.qry_User.fieldByName('用户ID').Value;
    strSQL:='update tbsdcme_studystatus set Send_Date=to_date('''+datetostr(self.dtpSendDate.Date)+''',''yyyy-MM-dd''),'
        +'Operator='''+trim(self.txtOperator.Text)+''',serial_number='''+sSerialNum+''''
        +' where User_ID='''+sUserID+''' and type_id='''+KCID+''';';    self.qry_Pub.SQL.Add(strSQL);
    frm_pubKC.qry_User.Next;
  end;
  self.qry_Pub.SQL.SaveToFile('e:\ss.txt');
  dataconn.conn.BeginTrans;
  try
    self.qry_Pub.ExecSQL;
    dataconn.conn.CommitTrans;
    MessageBox(Handle, '生成完毕!', '提示信息', MB_ICONASTERISK);
  except
    dataconn.conn.RollbackTrans;
    MessageBox(Handle, '生成失败!', '提示信息', MB_ICONHAND);
  end;

解决方案 »

  1.   

    字符变量做一下trim,最后的分号就不要了
      

  2.   

    to  jinjazz(人雅的标记--落寞刺客)
      self.qry_Pub.SQL.SaveToFile('e:\ss.txt');
      这一行可以不要.它是将生成的sql语句保存到'e:\ss.txt文件,只是用来查看用的,to  jinjazz(人雅的标记--落寞刺客)
       User_ID,type_id的类型都是VARCHAR2类型
      

  3.   

    在执行之前e:\ss.txt这个文件是不存在的.
      

  4.   

    while not frm_pubKC.qry_User.Eof do begin
    {...}
     self.qry_Pub.SQL.Add(strSQL);
     frm_pubKC.qry_User.Next;
    end;
    self.qry_Pub.ExecSQL;你的意思是:
     在「qry_Pub」中挿入多個「update」語句、最後一起「ExecSQL」?这样是不行的.試試↓
    dataconn.conn.BeginTrans;
    try
      while not frm_pubKC.qry_User.Eof do begin
        {...}
        self.qry_Pub.SQL.Add(strSQL);
        self.qry_Pub.ExecSQL;
        frm_pubKC.qry_User.Next;
      end;
      dataconn.conn.CommitTrans;
    except
      dataconn.conn.RollbackTrans;
    end;
      

  5.   

    谢谢cronuz(cronus),看样子还只能用这种办法了.就没有办法做批量一次性更新吗?也就是同时执行多个SQL语句.
      

  6.   

    批量処理、用「Oracle PL/SQL」写存储过程、是効率最高的。
      

  7.   

    建议楼主写成一个sql块
    然后用程储过程来处理
      

  8.   

    就没有办法做批量一次性更新吗?也就是同时执行多个SQL语句.
    答:可以!解决方法如下:
    sSql:='begin';
    for i:=1 to XXXdo //用for来加入你的操作记录,插入,更新删除都可以。
    begin
      sSql:=sSql+ 'insert into Tablename(field1,field2...) value() ';
    end;
    sSql:=sSql+ 'commit; end;';with query1 do 
    begin
      close;
      sql.clear;
      sql.add(sSql);
      execsql;
    end;