【问题标题】:How to extract last month of dynamic table from database如何从数据库中提取上个月的动态表
【发布时间】:2019-11-18 20:39:46
【问题描述】:

在一个数据库中,存在 12 个不同的动态表。前-

arch_tbl_jan
arch_tbl_feb
arch_tbl_mar
arch_tbl_apr
arch_tbl_may
arch_tbl_jun
arch_tbl_jul
arch_tbl_aug
arch_tbl_sep
arch_tbl_oct
arch_tbl_nov
arch_tbl_dec

这 12 个动态表存在于 schema 下的一个数据库中。我想按月提取SELECT 语句。对于前 APRIL 月份,我想提取 MARCH 月份的表 (arch_tbl_mar),对于 JUNE 想要提取 MAY 月的表 (arch_tbl_may)。我如何按月提取这些动态表。 选择语句like-

select id, name from arch_tbl_jan;   --(In Feb month)

【问题讨论】:

    标签: sql oracle plsql datatable


    【解决方案1】:
    declare 
     v_sql varchar2(10000);
     l_table_name varchar2(40) := 'arch_tbl_' 
                                 || TO_CHAR( add_months(sysdate,-1),'MON');
    BEGIN
     v_sql := 'select .. into ....... from ' || l_table_name || ' .... ';
     execute immediate v_sql;
     commit;
    END;
    

    【讨论】:

    • 你没有选择 into 任何东西,所以查询实际上不会被执行;如果您确实选择了某些内容,那么您需要以某种方式显示它。打开一个 refcursor 似乎相当简单。
    【解决方案2】:

    如果您使用的是 Oracle 12c 及更高版本,请将 DBMS_SQL.RETURN_RESULT 与动态游标一起使用。使用ADD_MONTHS, SYSDATETO_CHAR 根据运行日期自动分配表名。

    declare
       x SYS_REFCURSOR;
       l_table_name varchar2(40) := 'arch_tbl_' 
                                     || TO_CHAR( add_months(sysdate,-1),'fmMON');
    BEGIN
         OPEN x FOR 'SELECT * FROM ' || l_table_name;
         DBMS_SQL.RETURN_RESULT(x);
    END;
    /  
    

    对于 11g,RETURN_RESULT 可以使用 DBMS_SQL 通过传递查询而不是 ref cursor 来实现。 这是一个例子:DEMO

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多