数据库按时间段自动清理数据

时间:2022-01-23 02:01:35
采用oracle数据库
用ole db连接方式

数据库中保存了数据操作的时间
如何根据一定的时间自动的删除以前的数据呢

37 个解决方案

#1


你自己delete不就行了,判断一下

#2


问题是如何自动

#3


使用任务,定时执行某存储过程。

#4


任务 在oracle里叫job,
例如:

declare 
  v_jobnum  number;
begin
  dbms_job.submit(v_jobnum,'spName;',sysdate,'last_day(sysdate)');
  COMMIT;
end;

#5


感谢楼上的!
我还是不太明白,oracle 是这样的,那么我在vc里面怎样实现呢? 我这里使用了定时器
OnTimer()函数,但算在这里做,如何来调用oracle里的这个任务呢?多谢,帮忙者加分

#6


vc执行存储过程:
extern _ConnectionPtr pGConnection;
_RecordsetPtr pInfoSet = NULL;
CString strSQL("");

_CommandPtr cmd;
try{
cmd.CreateInstance("ADODB.Command");

cmd->CommandText = (_bstr_t)"sp_name"; //存储过程的名字
cmd->ActiveConnection = pGConnection;
cmd->CommandType = adCmdStoredProc;//表示为存储过程adCmdStoredProc

//执行,获得结果
cmd->Execute(NULL, NULL, adCmdStoredProc);
其实这种功能不建议在客户端这样执行,除非你能保证你的程序一直不退出~
还是在服务器自动执行保险:)

#7


“如何来调用oracle里的这个任务呢?”好像可以自动执行,不需要调用,呵呵
能调用的是存储过程。不是任务。:)

#8


您能说的更具体一些么?你给我的那个存储过程,我不知道是怎样定时更新数据库的,或者说哪里操作删除其数据了呢,不好意思了,我真是衰!大哥多帮忙!

#9


我的这个程序就是一直都不退出

#10


我并没有给你删除数据的存储过程,那个要你自己写。
我给你的是定时调用的代码……数据库服务器会自己自动调用他的,你不用操心。
spName是删除数据的过程的名字,后面的是时间……具体的你可以查oracle方面资料。

下面的是vc的代码,你可以写进OnTimer里。

#11


“我给你的是定时调用的代码……数据库服务器会自己自动调用他的,你不用操心。“

有歧义,应该是
我给你的是设定定时调用的代码……数据库服务器会自己自动调用他(删除数据的过程)的,你不用操心。

#12


cmd.CreateInstance("ADODB.Command");
这是什么意思呢? ADODB??那我在OnTimer ()中写些什么?你给我的写进去么?还是只写上删除的过程?没有用过,资料也不全,真是无从下手
最近也很郁闷工作
能有更直接的方式联系您么?比如msn

#13


不好意思,忘了你是用oledb的,oledb执行过程……我还忘了,以前用的时候有个问题没搞定,没继续用:(

你搜一下其他的oledb的内容吧,要是着急……还是将过程写在服务器端吧,呵呵

我这不能msn,学校不让~

#14


哎,看来只有结贴了
我怎么这么背!

#15


不用着急,搞定了再结,没准别人会告诉你的。

#16


恩,好吧,谢谢你了

#17


我想现在这题yinggai是简单一些了,我把数据库改为:
时间,点号1 点号2……
2004   1      2  ……     
2005   2      8  ……

这样,只要知道时间就可以删除,那在ole db这种方式下的删除一段时间内的数据该如何来作呢??我不知了,不用存储过程吧,我那个不明白怎么调用的

#18


sqlserver里面也有job的。。你可以建一个sqlserver的job..然后有两种方法可以达到你的目的。。第一就是规定时间让sqlserver执行你的job..第二就是在vc中取得时间去手动执行你已经建好的job

#19


job怎么建????我真不明白

#20


在ole db这种方式下的删除一段时间内的数据……就得直接执行sql语句了吧


job怎么建????……上面不是告诉你了么~~

#21


delete from tt where logDate < to_date('2004', 'YYYY')

#22


我好笨哦

这个存储过程在哪里写哦,oracle里面么?还是vc里 
oracle里怎么弄呢

#23


恩,好像明白一点了,就是建立的job行后怎么没作用哩

还有在vc里面怎么用呢?

我用 extern _ConnectionPtr pGConnection;
_RecordsetPtr pInfoSet = NULL;
CString strSQL("");

_CommandPtr cmd;
try{
cmd.CreateInstance("ADODB.Command");

cmd->CommandText = (_bstr_t)"sp_name"; //存储过程的名字
cmd->ActiveConnection = pGConnection;
cmd->CommandType = adCmdStoredProc;//表示为存储过程adCmdStoredProc

//执行,获得结果
cmd->Execute(NULL, NULL, adCmdStoredProc);
这个的话,又该写到哪里呢?怎么没有_CommandPtr cmd;这个变量?

#24


”就是建立的job行后怎么没作用哩“
首先你要写好那个存储过程(内容就是那个sql)
(如果用vc实现,那好像就不用多此一举了)
确定你的存储过程执行结果正确(就是可以正常删除你想删的那些东西)
然后运行设置job的那几句之后,要执行commit提交事务。不然白费。


要是用vc代码的话,自然是写在你的OnTimer里~
而且直接执行那个sql就行了,不用写存储过程的吧

“怎么没有_CommandPtr cmd;这个变量?“

没看到吗?在try上面,哈哈

#25


还有,那个例子是设置月底做事的,可能不满足你的要求,看看oracle的书,改一下吧,

#26


_CommandPtr 是这个 没有,还用加什么头文件么

我的一般也是月底删除
老板说可能得是不固定的,就是人为来设定

真的好感激你

#27


我说错了,那个vc代码用的ado,你用的oledb是吧~

oledb执行sql(不是存储过程哦)

CCommand<CNoAccessor, CNoRowset> command;
CString strSQL;
strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
hr = command.Open(GetDocument()->m_session, strSQL);
if(FAILED(hr)){
           //错误处理。。
}
command.Close();
--------------
不过要可以人为设定……又要写代码读取表里的设置,
所以我个人认为还是oracle的存储过程省事,千变万变都不用改vc程序,哈哈

#28


不好意思
strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);

这里是不是有点不对,还有m_BarCodeValue是什么
这句话又是什么意思呢?
我用的CRTUtoOrcSet ts;
    ts.Open ();                   //打开数据集
for(int i=0;i<=10;i++)
{
    ts.Delete();
    ts.Update();
}
    ts.Close();
怎么只删除了一条记录呢

#29


"这里是不是有点不对,还有m_BarCodeValue是什么"
晕倒,那是我的东西,你自己要改成你自己的~

“怎么只删除了一条记录呢”
你也没movenext啊~

用sql多方便,想怎么做就怎么做~

#30


你的update只需一次就可以了,不用在for循环里吧

#31


奇怪,我加上了MoveNext()还是只删除一条

“晕倒,那是我的东西,你自己要改成你自己的~”
我知道那时你的阿,我是说是指的什么

我也想用sql阿,可是strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
这句话就是不不对,_T是用的宏么?

#32


strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
少了半个)呵呵,不过这个对你好像没啥用的,都说了,这个是ado,你用oledb的。

#33


你那种删法,我没怎么用过,批量删除就直接用sql。

看错了,
strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
应该是
strSQL.Format(_T("update T_Check set BarCode = '%s'),
m_BarCodeValue);

#34


楼主不会收短消息的吗???这都快成聊天帖了@_@

#35


O 现在可以了,可以删除多条数据
不过这样做的确也是不合适,不过我实在不知存储过程怎么办了

#36


建立过程:
create or replace procedure sp_xxName
is
begin
delete from .....
end;

#37


什么也不说了,你能告诉我的,我都明白了,就是我的问题依然没有很好的解决,算了,我揭帖了,真的好好感谢你!21bird!

#1


你自己delete不就行了,判断一下

#2


问题是如何自动

#3


使用任务,定时执行某存储过程。

#4


任务 在oracle里叫job,
例如:

declare 
  v_jobnum  number;
begin
  dbms_job.submit(v_jobnum,'spName;',sysdate,'last_day(sysdate)');
  COMMIT;
end;

#5


感谢楼上的!
我还是不太明白,oracle 是这样的,那么我在vc里面怎样实现呢? 我这里使用了定时器
OnTimer()函数,但算在这里做,如何来调用oracle里的这个任务呢?多谢,帮忙者加分

#6


vc执行存储过程:
extern _ConnectionPtr pGConnection;
_RecordsetPtr pInfoSet = NULL;
CString strSQL("");

_CommandPtr cmd;
try{
cmd.CreateInstance("ADODB.Command");

cmd->CommandText = (_bstr_t)"sp_name"; //存储过程的名字
cmd->ActiveConnection = pGConnection;
cmd->CommandType = adCmdStoredProc;//表示为存储过程adCmdStoredProc

//执行,获得结果
cmd->Execute(NULL, NULL, adCmdStoredProc);
其实这种功能不建议在客户端这样执行,除非你能保证你的程序一直不退出~
还是在服务器自动执行保险:)

#7


“如何来调用oracle里的这个任务呢?”好像可以自动执行,不需要调用,呵呵
能调用的是存储过程。不是任务。:)

#8


您能说的更具体一些么?你给我的那个存储过程,我不知道是怎样定时更新数据库的,或者说哪里操作删除其数据了呢,不好意思了,我真是衰!大哥多帮忙!

#9


我的这个程序就是一直都不退出

#10


我并没有给你删除数据的存储过程,那个要你自己写。
我给你的是定时调用的代码……数据库服务器会自己自动调用他的,你不用操心。
spName是删除数据的过程的名字,后面的是时间……具体的你可以查oracle方面资料。

下面的是vc的代码,你可以写进OnTimer里。

#11


“我给你的是定时调用的代码……数据库服务器会自己自动调用他的,你不用操心。“

有歧义,应该是
我给你的是设定定时调用的代码……数据库服务器会自己自动调用他(删除数据的过程)的,你不用操心。

#12


cmd.CreateInstance("ADODB.Command");
这是什么意思呢? ADODB??那我在OnTimer ()中写些什么?你给我的写进去么?还是只写上删除的过程?没有用过,资料也不全,真是无从下手
最近也很郁闷工作
能有更直接的方式联系您么?比如msn

#13


不好意思,忘了你是用oledb的,oledb执行过程……我还忘了,以前用的时候有个问题没搞定,没继续用:(

你搜一下其他的oledb的内容吧,要是着急……还是将过程写在服务器端吧,呵呵

我这不能msn,学校不让~

#14


哎,看来只有结贴了
我怎么这么背!

#15


不用着急,搞定了再结,没准别人会告诉你的。

#16


恩,好吧,谢谢你了

#17


我想现在这题yinggai是简单一些了,我把数据库改为:
时间,点号1 点号2……
2004   1      2  ……     
2005   2      8  ……

这样,只要知道时间就可以删除,那在ole db这种方式下的删除一段时间内的数据该如何来作呢??我不知了,不用存储过程吧,我那个不明白怎么调用的

#18


sqlserver里面也有job的。。你可以建一个sqlserver的job..然后有两种方法可以达到你的目的。。第一就是规定时间让sqlserver执行你的job..第二就是在vc中取得时间去手动执行你已经建好的job

#19


job怎么建????我真不明白

#20


在ole db这种方式下的删除一段时间内的数据……就得直接执行sql语句了吧


job怎么建????……上面不是告诉你了么~~

#21


delete from tt where logDate < to_date('2004', 'YYYY')

#22


我好笨哦

这个存储过程在哪里写哦,oracle里面么?还是vc里 
oracle里怎么弄呢

#23


恩,好像明白一点了,就是建立的job行后怎么没作用哩

还有在vc里面怎么用呢?

我用 extern _ConnectionPtr pGConnection;
_RecordsetPtr pInfoSet = NULL;
CString strSQL("");

_CommandPtr cmd;
try{
cmd.CreateInstance("ADODB.Command");

cmd->CommandText = (_bstr_t)"sp_name"; //存储过程的名字
cmd->ActiveConnection = pGConnection;
cmd->CommandType = adCmdStoredProc;//表示为存储过程adCmdStoredProc

//执行,获得结果
cmd->Execute(NULL, NULL, adCmdStoredProc);
这个的话,又该写到哪里呢?怎么没有_CommandPtr cmd;这个变量?

#24


”就是建立的job行后怎么没作用哩“
首先你要写好那个存储过程(内容就是那个sql)
(如果用vc实现,那好像就不用多此一举了)
确定你的存储过程执行结果正确(就是可以正常删除你想删的那些东西)
然后运行设置job的那几句之后,要执行commit提交事务。不然白费。


要是用vc代码的话,自然是写在你的OnTimer里~
而且直接执行那个sql就行了,不用写存储过程的吧

“怎么没有_CommandPtr cmd;这个变量?“

没看到吗?在try上面,哈哈

#25


还有,那个例子是设置月底做事的,可能不满足你的要求,看看oracle的书,改一下吧,

#26


_CommandPtr 是这个 没有,还用加什么头文件么

我的一般也是月底删除
老板说可能得是不固定的,就是人为来设定

真的好感激你

#27


我说错了,那个vc代码用的ado,你用的oledb是吧~

oledb执行sql(不是存储过程哦)

CCommand<CNoAccessor, CNoRowset> command;
CString strSQL;
strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
hr = command.Open(GetDocument()->m_session, strSQL);
if(FAILED(hr)){
           //错误处理。。
}
command.Close();
--------------
不过要可以人为设定……又要写代码读取表里的设置,
所以我个人认为还是oracle的存储过程省事,千变万变都不用改vc程序,哈哈

#28


不好意思
strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);

这里是不是有点不对,还有m_BarCodeValue是什么
这句话又是什么意思呢?
我用的CRTUtoOrcSet ts;
    ts.Open ();                   //打开数据集
for(int i=0;i<=10;i++)
{
    ts.Delete();
    ts.Update();
}
    ts.Close();
怎么只删除了一条记录呢

#29


"这里是不是有点不对,还有m_BarCodeValue是什么"
晕倒,那是我的东西,你自己要改成你自己的~

“怎么只删除了一条记录呢”
你也没movenext啊~

用sql多方便,想怎么做就怎么做~

#30


你的update只需一次就可以了,不用在for循环里吧

#31


奇怪,我加上了MoveNext()还是只删除一条

“晕倒,那是我的东西,你自己要改成你自己的~”
我知道那时你的阿,我是说是指的什么

我也想用sql阿,可是strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
这句话就是不不对,_T是用的宏么?

#32


strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
少了半个)呵呵,不过这个对你好像没啥用的,都说了,这个是ado,你用oledb的。

#33


你那种删法,我没怎么用过,批量删除就直接用sql。

看错了,
strSQL.Format(_T("update T_Check set BarCode = '%s',
m_BarCodeValue);
应该是
strSQL.Format(_T("update T_Check set BarCode = '%s'),
m_BarCodeValue);

#34


楼主不会收短消息的吗???这都快成聊天帖了@_@

#35


O 现在可以了,可以删除多条数据
不过这样做的确也是不合适,不过我实在不知存储过程怎么办了

#36


建立过程:
create or replace procedure sp_xxName
is
begin
delete from .....
end;

#37


什么也不说了,你能告诉我的,我都明白了,就是我的问题依然没有很好的解决,算了,我揭帖了,真的好好感谢你!21bird!