为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:
【CPU】:
【问题描述】*:
CREATE TABLE new_talbe LIKE _talbe ;
这个会把数据也复制到新表中
create table new_talbe
as select * from old_table where 1=2
如果只是个别表的话,可以通过达梦客户端工具将查看表结构,将建表语句复制出来,然后更改表名,约束名,索引名等重建;
通过function实现
-- tableTemplate: 主表
-- tableName:目标表(分表)
-- 达梦数据库拷贝表结构以及索引(用于创建分表)
CREATE OR REPLACE FUNCTION copyTableStructure(tableTemplate VARCHAR(100),tableName VARCHAR(100)) RETURN VARCHAR AS
DECLARE
create_table_ddl_sql TEXT;
create_table_index_sql TEXT;
column_name VARCHAR(100);
cur_column_name VARCHAR(100);
index_name VARCHAR(512);
uniqueness VARCHAR(20);
new_index_name VARCHAR(100);
cur_schema VARCHAR(50):=SYS_CONTEXT('USERENV','CURRENT_SCHEMA');
index_count INT;
CURSOR c2;
CURSOR c1 FOR SELECT INDEX_NAME FROM USER_INDEXES WHERE USER_INDEXES.TABLE_NAME=tableTemplate AND USER_INDEXES.TABLE_TYPE='TABLE' AND USER_INDEXES.INDEX_TYPE='NORMAL' AND USER_INDEXES.TABLE_OWNER=cur_schema;
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE',tableTemplate,cur_schema) INTO create_table_ddl_sql;
create_table_ddl_sql:=replace(create_table_ddl_sql,tableTemplate,tableName);
EXECUTE IMMEDIATE create_table_ddl_sql;
OPEN c1;
LOOP
column_name:='';
index_name:='';
FETCH c1 INTO index_name;
EXIT WHEN c1%NOTFOUND;
OPEN c2 FOR 'select COLUMN_NAME from USER_IND_COLUMNS where INDEX_NAME=?' USING index_name;
LOOP
FETCH c2 INTO cur_column_name;
EXIT WHEN c2%NOTFOUND;
column_name:=column_name||'_'||cur_column_name;
END LOOP;
CLOSE c2;
new_index_name:='idx_$tableName_$columnName';
new_index_name:=replace(new_index_name,'$tableName',tableName);
new_index_name:=replace(new_index_name,'$columnName',column_name);
SELECT COUNT(*) INTO index_count FROM SYS.USER_INDEXES WHERE USER_INDEXES.INDEX_NAME=new_index_name;
if index_count>0 THEN
CONTINUE;
END IF;
SELECT SYS.DBMS_METADATA.GET_DDL('INDEX',index_name,cur_schema) INTO create_table_index_sql;
print(create_table_index_sql);
create_table_index_sql:=replace(create_table_index_sql,tableTemplate,tableName);
create_table_index_sql:=replace(create_table_index_sql,index_name,new_index_name);
print(create_table_index_sql);
EXECUTE IMMEDIATE create_table_index_sql;
END LOOP;
CLOSE c1;
return 'SUCCESS';
EXCEPTION
WHEN OTHERS THEN
IF c2 IS NOT NULL THEN
IF c2%ISOPEN THEN
CLOSE c2;
END IF;
END IF;
IF c1 IS NOT NULL THEN
IF c1%ISOPEN THEN
CLOSE c1;
END IF;
END IF;
PRINT 'CREATE TABLE ERR:'||SQLERRM;
return 'CREATE TABLE ERR:'||SQLERRM;
END;

create table AAA as select * from BBB where 1=0;