【问题标题】:Create table from table of column names and data types从列名和数据类型表创建表
【发布时间】:2020-02-08 07:14:16
【问题描述】:

使用元数据表 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');
)

注意不能使用“CREATE TABLE new_table AS”,因为在将其创建为外部表时它不适用于“组织外部”。

这样做的最终目标是让客户端应用程序向数据库发送查询,以通过仅更改每个查询中的表和 csv 文件名来将不同的 csv 文件导入到不同的表中。

欢迎提出建议,谢谢!

【问题讨论】:

  • 您从哪里获得organization external 子句所需的信息,例如文件夹名称。
  • @WernfriedDomscheit csv 目录由客户端应用程序在前面的查询中管理,如果尚未创建目录,则其余部分大部分是静态的(日期格式除外,我仍然需要计算一种制作通用的方法)

标签: sql oracle select create-table external-tables


【解决方案1】:

编写查询,它将为您编写查询。例如:

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>

【讨论】:

  • 感谢您的详细回答,我觉得 Oracle 中没有简单的选项来执行此操作似乎很疯狂?
  • 不客气。那么,一种更简单的方法。如果您使用 GUI(例如 TOAD 或 SQL Developer),它会提供 Script 选项卡(查看某些表时),因此 - 复制/粘贴该脚本并重复使用它。它可能会比我在几分钟内写的上述(简单)原理更好,因为更复杂的数据类型会使事情变得更复杂,这个简单的查询可能会变成一个小怪物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多