可以用DBMS_SQL这个包,是动态执行SQL语句的包
例子:
create or replace procedure single_Row_insert
           (c1 number, c2 number, r out number) is
      c number;
      n number;
      begin
        c := dbms_sql.open_cursor;
        dbms_sql.parse(c, 'insert into tab values (:bnd1, :bnd2) ' ||
                          'returning c1*c2 into :bnd3', 2);
     dbms_sql.bind_variable(c, 'bnd1', c1);
        dbms_sql.bind_variable(c, 'bnd2', c2);
        dbms_sql.bind_variable(c, 'bnd3', r);
        n := dbms_sql.execute(c); 
        dbms_sql.variable_value(c, 'bnd3', r); -- get value of outbind variable
        dbms_Sql.close_Cursor(c);
      end;
      /

解决方案 »

  1.   

    可是楼上,你的procedure创建的时候参数还是固定的啊,我也自己写了一个动态执行的sql语句的类,如:
    for(...)
    {
    sprintf(sqlcmd,"insert into ......",sqlwhere);
    mydatabase.modifysql(sqlcmd);

    我觉得你的效果和我是一样的
      

  2.   

    不过话说回来,我自己也没测试过batch insert和一条条insert,最后再提交,
    在效率上差别有多大,呵呵,只是理论上的想找一个更好的方法
      

  3.   

    差别很大的,劝你最好重新封装自己的proc处理dll的sql类,做到灵活处理insert,update.
      

  4.   

    可是我就是不知道怎么灵活的batch insert 啊,楼上,能不能做个例子,用类似
    EXEC SQL FOR :totalcount INSERT INTO tollfee_switch (ticket_id,tariff_id,time_span_id,ccount,fee,part_id)
            VALUES(:ticketid,:tariffid,:timespanid,:ccount,:fee,:partid);
      

  5.   

    我的意思是你要把类似
    EXEC SQL FOR :totalcount INSERT INTO tollfee_switch (ticket_id,tariff_id,time_span_id,ccount,fee,part_id)
            VALUES(:ticketid,:tariffid,:timespanid,:ccount,:fee,:partid);
    的句子,转化成
    string sSql = "insert into table(colm) valuses(val)";;
    sql.excute(sSql);
    的形式,最好封装两个雷,一个重写proc,一个容器作输入输出参数用
    这是思想,具体的就看你的了。