有这样一个语句
SELECT a.acct_id,a.county_code,a.county_name,a.plan_id,a.plan_name,a.qf,
decode(b.passed,NULL,a.qf,a.qf+b.passed) last_fee FROM
kswqf a,
(SELECT b.acct_id,a.paid_amount/100 passed FROM zg.acc_busi_rec_0793200804 a,
zg.acc_bill_079320080406 d
WHERE a.acct_id=b.acct_id AND a.paid_amount=b.unpay_fee AND a.paid_amount>0) b
WHERE a.acct_id=b.acct_id(+)
这里面的表 zg.acc_busi_rec_0793200804,zg.acc_bill_079320080406都是动态变更的。比如
zg.acc_bill_079320080401
zg.acc_bill_079320080402
zg.acc_bill_079320080403
zg.acc_bill_079320080404
zg.acc_bill_079320080405
zg.acc_bill_079320080406
zg.acc_bill_079320080407
...........
这样的日期增长表,我怎么在一个写好的脚本中实现在当天取当天表中的数据呢?
比如今天是0406就取zg.acc_bill_079320080406这个表的数据,明天就取
zg.acc_bill_079320080407表中的数据,
我要在上面的语句中实现每天自动变更表名,取出最新的数据。然后我通过SQL SERVER2000的DTS包导入功能,
实现每天自动更新数据。
declare
v_sql varchar2(1024);
v_Tab varchar2(1024);
begin
select 'zg.acc_bill_0793' ¦ ¦ to_char(sysdate,'yyyymmdd') into v_Tab from dual;
v_sql := 'select * from ' || v_Tab;
execute immeidate v_sql;
end; 这个过程好像执行有错,高手看看有没有详细的解决办法呢?
SELECT a.acct_id,a.county_code,a.county_name,a.plan_id,a.plan_name,a.qf,
decode(b.passed,NULL,a.qf,a.qf+b.passed) last_fee FROM
kswqf a,
(SELECT b.acct_id,a.paid_amount/100 passed FROM zg.acc_busi_rec_0793200804 a,
zg.acc_bill_079320080406 d
WHERE a.acct_id=b.acct_id AND a.paid_amount=b.unpay_fee AND a.paid_amount>0) b
WHERE a.acct_id=b.acct_id(+)
这里面的表 zg.acc_busi_rec_0793200804,zg.acc_bill_079320080406都是动态变更的。比如
zg.acc_bill_079320080401
zg.acc_bill_079320080402
zg.acc_bill_079320080403
zg.acc_bill_079320080404
zg.acc_bill_079320080405
zg.acc_bill_079320080406
zg.acc_bill_079320080407
...........
这样的日期增长表,我怎么在一个写好的脚本中实现在当天取当天表中的数据呢?
比如今天是0406就取zg.acc_bill_079320080406这个表的数据,明天就取
zg.acc_bill_079320080407表中的数据,
我要在上面的语句中实现每天自动变更表名,取出最新的数据。然后我通过SQL SERVER2000的DTS包导入功能,
实现每天自动更新数据。
declare
v_sql varchar2(1024);
v_Tab varchar2(1024);
begin
select 'zg.acc_bill_0793' ¦ ¦ to_char(sysdate,'yyyymmdd') into v_Tab from dual;
v_sql := 'select * from ' || v_Tab;
execute immeidate v_sql;
end; 这个过程好像执行有错,高手看看有没有详细的解决办法呢?
immediate写错了,表名貌似没有问题,可以output出来看看,写成存储过程,定时调用就ok了。
DTS包中是否能建立ORACLE的存储过程呢?
高手给个具体实现的详细解释吧
select 'zg.acc_bill_0793' ¦ ¦ to_char(sysdate,'yyyymmdd') into v_Tab from dual;
v_sql := 'insert into tmp_tab' || 'select * from ' || v_Tab;
execute immeidate v_sql;
然后针对tmp_tab进行你的DTS处理。当然,处理之前应该有execute immeidate 'truncate table tmp_tab' 操作。
2、execute immeidate 'truncate table tmp_tab';
3、select 'zg.acc_bill_0793' ¦ ¦ to_char(sysdate,'yyyymmdd') into v_Tab from dual;
v_sql := 'insert into tmp_tab' ¦ ¦ 'select * from ' ¦ ¦ v_Tab;
execute immeidate v_sql;
4、后面的操作基于tmp_tab表进行,每次这个表是结果表。下次从2开始处理,就一直是每天的数据。
说明一下:
一.只用存储过程,然后配合DBMS_JOB包就可以了,至少我以前遇到同类问题是这样解决的,没有使用DTS之类的东东;
二.具体方法:
1.创建一个存储过程,你甚至可以专门创建函数来返回你要的表名,存储过程中是你要做的操作,至于具体操作,你自己编写好保证没有语法跟逻辑错误就可以了;
2.使用DBMS_JOB.COMMIT(),来提交一个任务,设置参数:包括job名,要调用的过程名,首次调用时间,间隔时间;
注意:程序的执行是需要时间的,如果你是在一天的临界点调用的话,请留好足够的时间,否则,万一到了24点之后,你的表名可能会变成下一天的表;
3.运行JOB
begin
dbms_job.run(:job_name);
end
4.有变更需要时,dbms_job.remove(:job_name)停止job,修改你的存储过程;