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>
我希望在 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>