从 DB2 11.1 LUW 生成 table DDL

Generate table DDL from DB2 11.1 LUW

我想为 table 生成 DDL 脚本文件。我很乐意使用 SQL 语句来执行此操作,但我希望 CLPPLUS 或 CLP 解决方案除外。 这可以用 db2look 完成吗?我试过了,但总是得到太多细节。

db2look -d 'MY_DB' -z 'DB2INST1' -t 'MY_TABLE' -e -o MY_TABLE.sql

db2look -d 'MY_DB' -z 'DB2INST1' -t 'MY_TABLE' -e -noview -nofed -x -o MY_TABLE.sql

我只想要基本的 DDL(create table 语句),我不需要任何关于 table 的额外细节。

无法使 db2look 只为 CREATE TABLE 语句打印 DDL。
如果您使用的是 Linux / Unix,您可以尝试以下操作:

db2look -d MY_DB -z DB2INST1 -t MY_TABLE -e -noview -nofed \
| awk -v RS='' '/CREATE TABLE/' \
| tee MY_TABLE.sql

如前所述,db2look 工具有局限性,其中之一是它不会专门为您提供所需的信息子集。因此,您可以 post 处理输出(如 Mark Ba​​rinstein 所建议)。

根据您只需要 'create table' DDL 的原因,有时,您只需要使用 CREATE TABLE ... LIKE ... 获得结果,特别是如果您使用声明的全局临时 tables。使用该方法,无需使用 db2look.

对于 Db2-LUW - SQL 如果您的许可和授权正确,还有另一种方法。

对于 Db2-Linux/Unix/Windows,有一个名为 SYSPROC.DB2LK_GENERATE_DDL 的未记录的存储过程,它将数据写入 SYSTOOLS.DB2LOOK_INFO。如果 grants/permissions 对您的帐户是正确的,那么您可以将此技术与纯 SQL 一起使用,以 select 有效地从 SYSTOOLS.DB2LOOK_INFO 中提取。实例所有者通常已经拥有所需的权限(包括对过程的执行权限和对序列 db2look_token 的权限以及对 systools.db2look_info 和相关视图的 select 访问权限。)

假设我有一个名为 USER1.MYTAB 的 table,我想用普通的 SQL 提取其 DDL,这里是示例代码:

--#SET TERMINATOR @
create or replace variable  my_ddl varchar(1024)@

begin
    declare v_out_token integer default 0;

    call sysproc.db2lk_generate_ddl('-e -t USER1.MYTAB', v_out_token);

    select substr(sql_stmt,1,1024)
    into my_ddl
    from systools.db2look_info
    where op_token = v_out_token
    and sql_operation='CREATE' with ur;

end@


values(my_ddl)@

流行的 DBeaver GUI 工具和其他一些工具一样使用这种技术。您也可以 post 处理 SQL 中 SQL_STMT 列的内容。

您可以考虑对 IBM 改进记录此接口的建议进行投票:

https://ibm-data-and-ai.ideas.aha.io/ideas/DB24LUW-I-962

不幸的是,IBM 已将其设置为低优先级 'future consideration',但投票的人越多,IBM 的某些人可能会注意到。