哈哈,我这样用过,挺不错的。先写个存储过程,只有一句代码:
create or replace procedure exe_pl_sql (v_sql_block in varchar2);
begin
execute immediate v_sql_block;
end;
然后,在客户端拼出PL/SQL程序段,
strPl_Sql:=' BEGIN ';
strPl_Sql:=strPl_Sql+'INSERT .... ;  '; //别忘了带个‘;’
strPl_Sql:=strPl_Sql+'UPDATE .... ;  '; 
strPl_Sql:=strPl_Sql+'DELETE .... ;  '; 
........
//最后一句
strPl_Sql:=strPl_Sql+' COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK;RAISE;END;';//OK,PL/SQL拼完了,用存储过程控件执行吧!
 with StoredProc_pub do
      begin
        Params.Clear;
        StoredProcName := ' exe_pl_sql';
        Params.CreateParam(ftString, 'v_sql_block', ptInput);
        Params[0].AsString :=strPl_Sql ;
        StoredProc_pub.ExecProc;
      end;这个办法不太地道,但很好使,控制事务也很简单!

解决方案 »

  1.   

    我想写成这种形式,可是总不行
        with StoredProc_pub do
          begin
            Params.Clear;
            StoredProcName := ' exe_pl_sql';
            Params.CreateParam(ftString, 'v_sql_block', ptInput);
            Params[0].AsString :=Memo1.Text;
            StoredProc_pub.ExecProc;
          end;
       为什么?
      

  2.   

    Memo1.Text中包含回车换行符,所以不行!
      

  3.   

    var
    strPl_Sql :string;  for  i:=0 to memo1.Lines.Count -1 do
         strPl_Sql :=strPl_Sql +memo1.Lines[i];
      

  4.   

    只能替换了
          Memo1.text:=StringReplace(Memo1.Text,#$D,' ',[rfReplaceAll]);
          Memo1.text:=StringReplace(Memo1.Text,#$A,' ',[rfReplaceAll]);
        天哪!谁还有好办法!
      

  5.   

    没问题,create or replace procedure exe_pl_sql (v_sql_block in varchar2);
    begin
    v_sql_block :=replace(v_sql_block ,chr(13)||chr(10),'');
    execute immediate v_sql_block;
    end;