Bug:AddQueue对于Oracle数据库生成的sql不完整!!是不是我用错了? 返回

SqlSugar
10 95
该叫什么 高彬 发布于5天前
悬赏:0 飞吻

经过测试 使用AddQueue ,对于 Oracle数据库,最终SaveQueues生成的SQL执行时会报错,错误:ORA-00911: 无效字符。


使用下面的语句查询Oracle执行的语句,发现SaveQueues生成的语句没有问题,但是没有在sql前加begin,sql后没有end;


select b.SQL_TEXT,b.FIRST_LOAD_TIME,b.SQL_FULLTEXT
from v$sqlarea b
order by b.FIRST_LOAD_TIME desc


oracle版本是:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE 11.2.0.1.0 Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

程序调试Aop生成的SQL截图如下:

2.png


如果不使用AddQueue ,单独执行每条语句是正常的, 这个问题我应该如何避开 ?

热忱回答10

  • var db = GetInstance();
    db.Insertable<Student>(new Student() { Name = "a" }).AddQueue();
    db.Updateable<Student>(new Student() { Name = "b" }).AddQueue();
    db.SaveQueues()

    上面写法生成的SQL大概是这样:

    insert into student(id,name) values(0,'a')

    update student set name='b' where id=0


    但是对于 Oracle数据库,需要在sql前后加begin和end!,大概应该这样:

    begin
    insert into student(id,name) values(0,'a');
    update student set name='b' where id=0;
    end


    0 回复
  • 会加的

    0 回复
  • AOP看SQL

    0 回复
  • 我重新做了测试,通过Aop输出的sql没有  begin和end,请查看我的截图:

    db.Aop.OnLogExecuting = (sql, para) => { Console.WriteLine($"{sql}"); };

    1.png


    2.png

    0 回复
  •             db.AddQueue("begin;");
                db.Updateable(updateObj).AddQueue();
                db.Updateable(updateObj).AddQueue();
                db.AddQueue("end;");
                db.SaveQueues();


    0 回复
  • ORALCE不推荐这个方法,你可以按上面的用法

    0 回复
  • @fate sta:请教一下:如果oracle不推荐这个方法,那么向数据库的批量提交,应该如何写呢 ?麻烦推荐一下方法。


    0 回复
  • @fate sta:测试了,开发者主动加 db.AddQueue("begin;");db.AddQueue("end;");  对于 oracle 是可以正常执行sql的。

    0 回复
  • @高彬:用事务处吧,批量操作都有方案文档 ORACLE中有

    0 回复
  • 比如你上面的代码可以优化成

    db.Update(实体)改成db.Update(list<实体>)

    0 回复