常用数据删除方法
用DELETE语句删除数据库表中数据,当删除的数据量不多时,可简单地一次性删除,但是当遇到数据量很大的情况系下,需要进行数据分割。可根据数据表自身特点按照字段特征来进行分割,不同的数据表中有不同的字段就需要进行不同的分割,根据分割反复进行DETELE删除操作,否则就可能出现回滚段空间满错误。1
Oracle数据库有一个或多个回滚段。回滚段是数据库的一部分,是一个存储区域,数据库使用该存储区域存放更新的事物或删除行的数据值。删除的数据原值就存在回滚段,对于批量数据可以分配给较大的回滚段,但也是有限的。每个回滚段的块只能包含一个事物的信息,当删除的数据记录达到一定的数量,膨胀到难以承受的程序就不能进行相应正常的工作了。1
伪列数据删除方法该方法分两步来实现。首先使用游标技术收集满足删除条件记录的ROWID值,其次根据已收集的ROWID集合,进行删除操作。在删除过程中一次删除数据的记录数可自定义。1
伪列ROWIDOracle数据库中每个表中都有一个名为ROWID的伪列,是一个18字节[数据对象编号(6字节)+文件编号(3字节)+块编号(6字节)+行编号(3字节)]的字符串,它允许使用保留字ROWID作为列名来访问任意行的地址。ROWID伪列不存存储在数据库中,不占用任何空间,也不能被修改或删除。只要表格中存在某个行,就有对应该行的ROWID。由于ROWID具有唯一性,因此ROWID可看做是数据库表中每一行唯一的关键字。1
利用伪列ROWID来实现批量数据删除操作的,表结构为:
CRKATE TABLE student( NUM VARCHAR2(10) NOT NULL, NAME VARCHAR2(10) NOT NULL, MAJOR VARCHAR2(10) NULL, BIRTHDAY DATE NULL, PRIMARY KEY(NUM))假设表中插入了18条记录,在PL/SQL环境执行下条语句:
SELETE ROWID FROM student结果显示为:
ROWIDAAAOBSAAEAAAmwQAAAAAAOBSAAEAAAmwQAABAAAOBSAAEAAAmwQAAC... ... ...AAAOBSAAEAAAmwQAAR用ROWID删除这18条中的一些记录,SQL语句如下:
DELETE student WHERE ROWID IN('AAAOBSAAEAAAmwQAAA','AAAOBSAAEAAAmwQAAB',...)MFC ADO获取记录集可在Visual C++中使用ADO访问数据库,并且自定义类CADOConn实现访问操作。动态SQL语句可以通过参数传给CADOConn::GetRecordSet函数获取查询结果,然后使用CADOConn::GetRecordCount函数获得记录数,再遍历结果集,通过CADDOConn::GetCollect函数得到字段值。1
例如,从表student中检索生日为“1991-07-17”的学生姓名name的值,并存放在变量strname中进行测试,代码如下:
CString selstr="select * from tempstudent where birthday=to_date('1991-07-17','yyyy-mm-dd')";Adoconn.GetRecordSet(selstr);int Count = Adoconn.GetRecordCount();CString name;for(int j=0;jMoveNext();}数据删除的实现这里以上面的表student为例来说明具体实现步骤。假定该表有一定量的数据,以一次删除10条数据为例,删除过程如下:
提取伪列集合提取符合条件的ROWID集合,无条件删除全部记录。若是有条件的情况,只需要将条件作为字符串加入到SQL字符串变量中。设置ROWID集合不超过10,构造ROWID集合字符串。1
根据伪列值删除数据构造动态SQL语句,调用CADOConn::ExecuteSQL函数执行SQL语句,一次可删除10条记录数据。一般来说,一次删除的记录越多,速度越快,但是占用的ROLLBACK短也越大。1
示例代码如下:
int len=0,k;CString rowid,rowidSet="",Deletesql;CString selstr="select rowid from student";Adoconn.GetRecordSet(selstr);int Count=Adoconn.GetRecordCount();while(Count>0){ k=Count>10?10:Count; //ROWID集合数不超过10个 for(int j=0;jMoveNext(); } len=rowidSet.Getlength()-1; Deletesql="DELETE tempstudent WHERE rowid IN"; //构造动态SQL字符串 Deletesql+="("+rowidSet.Left(len)+")"; Adoconn.ExecuteSQl(Deletesql); Count-=10; rowidSet="";}Adoconn.Close; //关闭记录