Oracle中delete使用in做条件删除多条时删除失败

Oracle中delete使用in做条件删除多条时删除失败,第1张

存储过程有错误

问题主要在这里:

dsource_type = p_sCodes

;

select count(1)

      into v_count

      from dm_custlist_upload_batch d, cls_source_type t

     where 1 = 1

       and dsource_type = tcustlist_source_type_code

       and dsource_type = p_sCodes;

这个 p_sCodes 如果是I一个数字,用= 没问题。如果是2个数字 就得用in了。 你这里地方改一改就可以了

我也在学习,正好看到了一份资料,《oracle数据库dba专题技术精粹》。先说你的这个情况。。。。 oracle而言,查询的结果集是根据时间点来判定的,oracle内部通过系统变更号SCN作为相对时间点的标准,任何对数据库的改变都会产生scn,这是一个正整数,对数据块的数据改变的时候会对应的scn记录在块中。 架设查询开始的时候的scn 为T,则在查询所扫描的数据块中,如果数据的COMMIT SCN 小于T,则查询接受该数据,如果COMMIT scn 大于T 或者说没有产生COMMIT SCN(这个就是你所说的情况,delete后 没有提交的情况) ,则查询尝试去回滚段中查找数据。这是为了保证数据读取的时间点的一致性。

下面是说回滚段的内容,了解下会更清楚这个的。

sql>update t set object_id='0' where object_id='1234';

1 row updated;

sql>commit;

这个时候数据库先把语句的整个 *** 作包括数据‘0’ 和‘1234’ 写入日志缓冲区,然后把数据‘1234’ 和一些相关信息写入回滚段,最后把‘0’ 修改到数据缓冲区。 当发出提交命令的时候,如果日志缓冲区内容没有写入日志文件则必须写入日志文件,回滚段把该事物标记为已经提交,数据缓冲区中块的这些事务也标记为已经提交(在大事务的情况下如果数据缓冲区中块已经写入磁盘或者事务更改的块超过数据缓冲区大小的10%这不对这些块标志该事务为已经提交,这回影响到下次读该快)。

当如果回退这个事务。则数据库将把回滚段中数据‘1234’读出来写入数据缓冲区(数据缓冲区已经被修改为‘0’),这个回退的变化本身也被写入日志,这就是回退的过程。

通过回滚段中获取数据的时候,本质上是把数据缓冲区中的数据块做一份拷贝,然后将回滚段中记录的内容恢复到该块中。然后查询使用者个块来进行读取。

SallerID是integer型?or char?

ADOQuery1Close;

ADOQuery1SQLClear;

ADOQuery1SQLAdd('begin ');

ADOQuery1SQLAdd('delete from MainTable where SallerID='+rMainid+';');

ADOQuery1SQLAdd('end; ');

ADOQuery1ExecSql;

以上就是关于Oracle中delete使用in做条件删除多条时删除失败全部的内容,包括:Oracle中delete使用in做条件删除多条时删除失败、小弟刚学oracle数据库不久,有点疑问,delete *** 作的细节问题求助、Delphi sql delete 语句没有删除数据库数据!!急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10112531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存