注册

利用DBMS_METADATA包拼接sql脚本出现字段注释不能运行和出现多余索引的问题

进阶的Frame 2023/09/05 580 4 已解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: v8
【操作系统】:win10

全部sql

-- ----------------------这是达梦管理工具右键表属性生成的ddl CREATE TABLE "TEST_TABLE" ( "id" BIGINT IDENTITY(1, 1) NOT NULL, "target_id" INT NOT NULL, "local_time" DATETIME(3) NOT NULL, NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON COLUMN "TEST_USER"."TEST_TABLE"."id" IS '主键'; COMMENT ON COLUMN "TEST_USER"."TEST_TABLE"."target_id" IS '目标编号'; COMMENT ON COLUMN "TEST_USER"."TEST_TABLE"."local_time" IS '时间'; CREATE INDEX "IDX3" ON "TEST_USER"."TEST_TABLE"("local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE UNIQUE INDEX "IDX2" ON "TEST_USER"."TEST_TABLE"("target_id" ASC,"local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE UNIQUE INDEX "IDX1" ON "TEST_USER"."TEST_TABLE"("id" ASC,"local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; -- ----------------------------------- 这是自己查询生成的ddl -- 查询建表的ddl SELECT DBMS_METADATA.get_ddl('TABLE', 'TEST_TABLE') AS create_ddl FROM DUAL; -- 结果 CREATE TABLE "TEST_USER"."TEST_TABLE" ( "id" BIGINT IDENTITY(1, 1) NOT NULL, "target_id" INT NOT NULL, "local_time" DATETIME(3) NOT NULL, NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ; -- 查看表字段注释ddl SELECT DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT', 'TEST_TABLE') AS TABLE_DDL FROM DUAL; -- 结果 COMMENT ON COLUMN TEST_USER.TEST_TABLE(id) IS 主键 COMMENT ON COLUMN TEST_USER.TEST_TABLE(target_id) IS 目标编号 COMMENT ON COLUMN TEST_USER.TEST_TABLE(local_time) IS 时间 -- 查询表索引 SELECT DBMS_METADATA.get_ddl('INDEX', index_name) AS index_ddl FROM all_indexes WHERE TABLE_NAME = 'TEST_TABLE'; -- 结果 CREATE CLUSTER INDEX "INDEX33555491" ON "TEST_USER"."TEST_TABLE"( STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE UNIQUE INDEX "INDEX33555492" ON "TEST_USER"."TEST_TABLE"("id" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE INDEX "IDX3" ON "TEST_USER"."TEST_TABLE"("local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE UNIQUE INDEX "IDX2" ON "TEST_USER"."TEST_TABLE"("target_id" ASC,"local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE UNIQUE INDEX "IDX1" ON "TEST_USER"."TEST_TABLE"("id" ASC,"local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;

问题详细描述

image.png
如图,红框时官方管理工具生成的ddl,绿框时自己执行查询获取的ddl。
建表ddl是没问题的,和官方一样的。

字段注释问题

和官方差异很大:

  1. 模式名和表明没有引号;
  2. 字段值还是用的(id)来表示
  3. 注释没有引号
  4. 没有分号
  5. 运行报错,报错信息如下
    image.png

索引问题

image.png
红框中的不是我想要的,我觉得是我查询语句all_indexes写错了才会显示出来,但是目前还没找到解决方案。

第一句运行报错信息如下

[执行语句1]:
CREATE CLUSTER INDEX "INDEX33555491" ON "TEST_USER"."TEST_TABLE"( STORAGE(ON "MAIN", CLUSTERBTR) ;
执行失败(语句1)
-2007: 第 1 行, 第 104 列[ON]附近出现错误:
语法分析出错

第二句报错信息如下

[执行语句1]:
CREATE UNIQUE INDEX "INDEX33555492" ON "TEST_USER"."TEST_TABLE"("id" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
执行失败(语句1)
-7021: 第1 行附近出现错误:
无效的索引名

三四五句运行完全没问题

总共3个语句正依次执行... [执行语句1]: CREATE INDEX "IDX3" ON "TEST_USER"."TEST_TABLE"("local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; 执行成功, 执行耗时7毫秒. 执行号:6832 影响了0条记录 [执行语句2]: CREATE UNIQUE INDEX "IDX2" ON "TEST_USER"."TEST_TABLE"("target_id" ASC,"local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; 执行成功, 执行耗时7毫秒. 执行号:6833 影响了0条记录 [执行语句3]: CREATE UNIQUE INDEX "IDX1" ON "TEST_USER"."TEST_TABLE"("id" ASC,"local_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ; 执行成功, 执行耗时7毫秒. 执行号:6834 影响了0条记录 3条语句执行成功

虽说我能在代码流程中控制跳过头两句,但我不确定是不是所有的表的都存在,如果不是全部存在我该用什么逻辑进行判断删除跳过呢?

吐槽一句:服了客户了,dump文件备份恢复(写的相当nice)还不行,偏偏要sql脚本,又不需要手动执行恢复,搞不完还要被老大组长叼[流泪]
不过主要是自己太菜了,要是了解DBMS_METADATA也不至于两天还没搞出来。

希望能得到帮助,万分感谢!

回答 0
暂无回答
扫一扫
联系客服