有这样一个语句
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; 这个过程好像执行有错,高手看看有没有详细的解决办法呢?

解决方案 »

  1.   

    这个只能通过动态SQL来拼表名实现。
      

  2.   

    如何在ORACLE中具体实现? 不能自动变更的话就只能每天手动了,这个就比较郁闷了
      

  3.   


    immediate写错了,表名貌似没有问题,可以output出来看看,写成存储过程,定时调用就ok了。
      

  4.   

    我试了,不行的。应该是在处理细节上出了问题。
    DTS包中是否能建立ORACLE的存储过程呢?
    高手给个具体实现的详细解释吧
      

  5.   

    采用中间表,用
    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' 操作。
      

  6.   

    1、建一个和zg.acc_bill_079320080401一样结构的空表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开始处理,就一直是每天的数据。
      

  7.   

    看来我得好好学学ORACLE的存储过程了
      

  8.   


    说明一下:
    一.只用存储过程,然后配合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,修改你的存储过程;