Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中使用字符串选择表?_Sql_Oracle - Fatal编程技术网

Sql 如何在Oracle中使用字符串选择表?

Sql 如何在Oracle中使用字符串选择表?,sql,oracle,Sql,Oracle,首先,我知道这个问题很模糊,所以如果你能更好地描述它,请随意编辑。 有一些表格集,如TEST_201812、TEST_201901等。我有另一个存储这些值的表: TEST_DATE: ID DATE 1 201810 2 201811 3 201812 4 201901 现在我想要的是通过使用TEST_DATE选择上面提到的表,例如TEST_201812。我知道这是错的,但像这样的事情: select * from TEST_(select DATE from T

首先,我知道这个问题很模糊,所以如果你能更好地描述它,请随意编辑。 有一些表格集,如TEST_201812、TEST_201901等。我有另一个存储这些值的表:

TEST_DATE:

ID   DATE
1    201810
2    201811
3    201812
4    201901
现在我想要的是通过使用TEST_DATE选择上面提到的表,例如TEST_201812。我知道这是错的,但像这样的事情:

select * from TEST_(select DATE from TEST_DATE where ID = 1)

有人知道如何做到这一点吗?

说真的,这样的数据模型是一场灾难。如果您想单独保存月份,请使用单分区表

无论如何,这里有一个方法:

示例表和返回refcursor的函数:

SQL> create table test_201812 as select * From dept;

Table created.

SQL> create table test_date (id number, datum number);

Table created.

SQL> insert into test_date values (1, 201812);

1 row created.

SQL> create or replace function f_test (par_id in test_date.id%type)
  2    return sys_refcursor
  3  is
  4    l_datum test_date.datum%type;
  5    l_str   varchar2(200);
  6    l_rc    sys_refcursor;
  7  begin
  8    select datum
  9      into l_datum
 10      from test_date
 11      where id = par_id;
 12
 13    l_str := 'select * from test_' || l_datum;
 14    open l_rc for l_str;
 15    return l_rc;
 16  end;
 17  /

Function created.
测试:

SQL> select f_test(1) from dual;

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

CURSOR STATEMENT : 1

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


SQL>

说真的,这样的数据模型是一场灾难。如果您想单独保存月份,请使用单分区表

无论如何,这里有一个方法:

示例表和返回refcursor的函数:

SQL> create table test_201812 as select * From dept;

Table created.

SQL> create table test_date (id number, datum number);

Table created.

SQL> insert into test_date values (1, 201812);

1 row created.

SQL> create or replace function f_test (par_id in test_date.id%type)
  2    return sys_refcursor
  3  is
  4    l_datum test_date.datum%type;
  5    l_str   varchar2(200);
  6    l_rc    sys_refcursor;
  7  begin
  8    select datum
  9      into l_datum
 10      from test_date
 11      where id = par_id;
 12
 13    l_str := 'select * from test_' || l_datum;
 14    open l_rc for l_str;
 15    return l_rc;
 16  end;
 17  /

Function created.
测试:

SQL> select f_test(1) from dual;

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

CURSOR STATEMENT : 1

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


SQL>

您必须使用动态SQL,即立即执行。但是,您应该修复数据模型。您应该有一个表,表中有一列日期。您必须使用动态SQL,即立即执行。但是,您应该修复数据模型。您应该有一个表,表中有一列日期。我运行的代码与您编写的代码完全相同。最后,它返回游标。您使用哪种工具?如果是某个GUI蟾蜍、SQL开发人员,双击光标,查看其中的内容。因为,你从来没有说过一旦你得到了结果你会怎么做是的,我用的是蟾蜍。首先,我想选择表,然后删除它并创建一个带有新日期的新表。但现在我意识到,正如你所建议的,只使用一张桌子更实际、更合理;这就是你应该走的路。我运行了你写的代码。最后,它返回游标。您使用哪种工具?如果是某个GUI蟾蜍、SQL开发人员,双击光标,查看其中的内容。因为,你从来没有说过一旦你得到了结果你会怎么做是的,我用的是蟾蜍。首先,我想选择表,然后删除它并创建一个带有新日期的新表。但现在我意识到,正如你所建议的,只使用一张桌子更实际、更合理;这是你应该走的路。