Как выбрать таблицу, используя строку в Oracle? - PullRequest
0 голосов
/ 31 декабря 2018

Прежде всего, я знаю, что вопрос расплывчатый, поэтому не стесняйтесь редактировать его, если вы можете описать его лучше.Есть несколько наборов таблиц, таких как TEST_201812, TEST_201901 и т. Д.У меня есть другая таблица, в которой хранятся эти значения:

TEST_DATE:

ID   DATE
1    201810
2    201811
3    201812
4    201901

Теперь я хочу выбрать таблицы, упомянутые выше (например, TEST_201812), используя TEST_DATE.Я знаю, что это неправильно, но что-то вроде этого:

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

Кто-нибудь знает, как этого добиться?

1 Ответ

0 голосов
/ 31 декабря 2018

Серьезно, такая модель данных - это катастрофа .Если вы хотите хранить отдельные месяцы отдельно , используйте однораздельную таблицу.

В любом случае, вот один из способов сделать это:

Примеры таблиц и функциякоторый возвращает 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...