Oracle SQL 开发者动态日期 table 姓名

Oracle SQL Developer dynamic date table name

我希望在 Oracle SQL 开发人员的每周销售表中动态引用上周五的日期,即 SELECT * FROM Sales_DDMMYY

我可以在 SQL 服务器 (DECLARE / SET / EXECUTE) 中执行此操作,但对 SQL 开发人员没有任何乐趣。

即使能够创建要在代码中引用的日期变量也是一个很好的开始。

停止!

我强烈建议您不要这样做。这不是创建数据模型的方法。如果您有一个 table 包含与不同日期相关的值,那么日期应该是该 table 中的一列,例如

create table sales
  (id      number,
   datum   date,
   amount  number
  );

插入行为

insert into sales (id, datum, amount) 
  select 1, date '2020-06-01', 100 from dual union all
  select 2, date '2020-05-13', 240 from dual union all
  select 3, date '2020-05-13', 160 from dual;

并将其用作

select sum(amount)
from sales
where datum = date '2020-05-13'

的方法。按日期命名列是......嗯,接近自杀。


啊哈,现在我明白了:这是一个包含日期的 table 名称。没关系,我的建议仍然有效。 不要那样做。在单个 table.

中使用日期列

如果你愿意 - 如果你能负担得起 - 根据日期值对 table 进行分区。请注意,分区选项存在于 Oracle 企业版中,它非常昂贵。所以 - 它是日期列。


如果您对此无能为力,那么动态 SQL 就是了。例如:

样本table:

SQL> create table sales_200620 as select * From dept;

Table created.

接受ddmmyy值作为参数的函数,由table名称和returns一个refcursor组成:

SQL> create or replace function f_test (par_ddmmyy in varchar2)
  2    return sys_refcursor
  3  is
  4    l_table_name varchar2(30) := 'sales_' || par_ddmmyy;
  5    l_rc sys_refcursor;
  6  begin
  7    open l_rc for 'select * from ' || dbms_assert.sql_object_name(l_table_name);
  8    return l_rc;
  9  end;
 10  /

Function created.

测试:

SQL> select f_test('200620') from dual;

F_TEST('200620')
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON


SQL>

不创建函数:使用替换变量:

SQL> select * From &tn;
Enter value for tn: sales_200620

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>