为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: v8
【操作系统】:win10
-- ----------------------这是达梦管理工具右键表属性生成的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) ;
如图,红框时官方管理工具生成的ddl,绿框时自己执行查询获取的ddl。
建表ddl是没问题的,和官方一样的。
和官方差异很大:
红框中的不是我想要的,我觉得是我查询语句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
也不至于两天还没搞出来。
希望能得到帮助,万分感谢!
索引问题我用正则
INDEX\d{8}
进行排除了,如果有更好的方案,还望赐教