DB2使用来自查询的表名创建具有相同DDL的多个表

fkaflof6  于 2022-12-04  发布在  DB2
关注(0)|答案(2)|浏览(195)

我需要在模式中创建多个具有完全相同DDL的表。为此,我通常使用以下命令:

CREATE TABLE SCHEMA.XYZ_STORE_TABLE AS SCHEMA.EFG_STORE_TABLE

这部分很简单。现在我必须对1000个表重复同样的过程。为了使我的工作更简单,我创建了一个表,它将存储所有应该创建的表名,其结构如下所示:

CREATE TABLE SCHEMA.ABC_PROCESS(
    PROCESS_CD VARCHAR(32),
    PROCESS_NAME VARCHAR(100),
    PROCESS_STORE_TABLE_NAME VARCHAR(100)
)

然后,我可以查询SELECT PROCESS_STORE_TABLE_NAME FROM SCHEMA.ABC_PROCESS并获取要创建的表名。

| PROCESS_STORE_TABLE_NAME |
| ------------------------ |
| ABC_STORE_TABLE          |
| HIJ_STORE_TABLE          |

现在,我可以编写一个Java代码,它将获取这些表名,将其存储在ArrayList中,然后从Java代码中对该ArrayList的每个元素执行CREATE TABLE脚本。
有没有一种更简单的方法可以不用编写Java代码而使用SQL本身来完成它呢?(附言,您可以假设来自查询的表名还不存在)

vbkedwbf

vbkedwbf1#

可以在复合语句中使用动态sql。

--#SET TERMINATOR @
CREATE TABLE EFG_STORE_TABLE (I INT)@

CREATE TABLE ABC_PROCESS
(
  PROCESS_STORE_TABLE_NAME VARCHAR(100)
)@

INSERT INTO ABC_PROCESS (PROCESS_STORE_TABLE_NAME)
VALUES
  'ABC_STORE_TABLE'
, 'HIJ_STORE_TABLE'
@

BEGIN
  FOR C1 AS
    SELECT 
      'CREATE TABLE '
    || PROCESS_STORE_TABLE_NAME
    || ' LIKE EFG_STORE_TABLE'
      AS CMD
    FROM ABC_PROCESS
  DO
    EXECUTE IMMEDIATE C1.CMD;
  END FOR;
END
@

fiddle

oewdyzsn

oewdyzsn2#

是的,有这样一个办法:

SELECT CONCAT(
    'CREATE TABLE SCHEMA.XYZ_STORE_TABLE AS SCHEMA.',
    PROCESS_STORE_TABLE_NAME,
    ';'
)
FROM SCHEMA.ABC_PROCESS;

这将为您在ABC_PROCESS中找到的每个表名生成一个CREATE命令。

相关问题