Создать таблицу из таблицы имен столбцов и типов данных - PullRequest
0 голосов
/ 10 октября 2019

Использование таблицы метаданных USER_TAB_COLUMNS Я получил имена столбцов и типы данных одной из моих таблиц, например, так:

SELECT column_name, data_type
FROM USER_TAB_COLUMNS
WHERE table_name = 'BACKUP'
AND column_name NOT IN ('ID', 'ENV_ID');

Результат выглядит следующим образом:

COLUMN_NAME        |DATA_TYPE
--------------------------------------
SESSION_STATION     NVARCHAR2
user                NVARCHAR2
type                NCHAR
date                DATE
hour                NVARCHAR2

Я хочу создать новую внешнюю таблицу с такими именами столбцов и типами данных:

CREATE TABLE new_table
(
    SESSION_STATION     NVARCHAR2
    user                NVARCHAR2
    type                NCHAR
    date                DATE
    hour                NVARCHAR2
)
organization external
(
    ...
);

Я бы хотел сделать это, используя результатпредыдущего выбора во время создания новой таблицы вместо того, чтобы вводить ее вручную в запрос.

Я надеялся сделать это просто так, но, очевидно, не работает :

CREATE TABLE new_table
(
    SELECT column_name, data_type
    FROM USER_TAB_COLUMNS
    WHERE table_name = 'BACKUP'
    AND column_name NOT IN ('ID', 'ENV_ID');
)

NB I не может использовать «CREATE TABLE new_table AS», так как он не работает с «внешней организацией» при создании его в качестве внешней таблицы.

Конечная цель этого состоит в том, чтобы клиентское приложение отправляло запросы в базу данных для импорта различных файлов CSV в разные таблицы, изменяя только имя таблицы и файла CSV в каждом запросе.

Любойпредложения приветствуютсяО, спасибо!

1 Ответ

2 голосов
/ 10 октября 2019

Написать запрос, который напишет запрос для вас. Например:

SQL> select 'create table new_table (' result
  2    from dual union all
  3  select
  4    column_name ||' '||
  5    data_type   ||
  6    case when data_type = 'DATE' then null  -- no length for DATE datatype
  7         else '(' || data_length ||')'
  8    end         ||
  9    case when column_id = (select max(column_id)   -- omit comma for the last column
 10                           From user_tab_columns
 11                           where table_name = 'EMP')
 12                           then null
 13         else ','
 14    end
 15    from user_tab_columns
 16    where table_name = 'EMP'
 17  union all
 18  select ') organization external ...;'
 19  from dual;

RESULT
--------------------------------------------------------------------------------
create table new_table (
EMPNO NUMBER(22),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(22),
HIREDATE DATE,
SAL NUMBER(22),
COMM NUMBER(22),
DEPTNO NUMBER(22)
) organization external ...;

10 rows selected.

SQL>

Затем скопируйте / вставьте результат и выполните его;Я сделаю это без "внешнего" суффикса:

SQL> create table new_table (
  2  EMPNO NUMBER(22),
  3  ENAME VARCHAR2(10),
  4  JOB VARCHAR2(9),
  5  MGR NUMBER(22),
  6  HIREDATE DATE,
  7  SAL NUMBER(22),
  8  COMM NUMBER(22),
  9  DEPTNO NUMBER(22)
 10  ) ;

Table created.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...