从 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 Barinstein 所建议)。
根据您只需要 '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 的某些人可能会注意到。
我想为 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 Barinstein 所建议)。
根据您只需要 '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 的某些人可能会注意到。