我使用 dbms_metadata.get_ddl(...) 来获取对象 ddl 但它不会为列生成 ddl。 有没有办法获得列 ddl oracle 12 版本?
谢谢
我必须自己解决这个问题
我创建了一个
PLSQL
函数,该函数从当前模式/用户中的表创建 DDL 中提取列数据。
比重建一个
alter table
命令。
函数返回添加指定列所需的DDL语句。
get_column_ddl
CREATE OR REPLACE FUNCTION get_column_ddl(tableName IN VARCHAR2, columnName IN VARCHAR2)
RETURN VARCHAR2
AS
outStr VARCHAR2(3333) := 'undefined';
BEGIN
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'PRETTY', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SEGMENT_ATTRIBUTES', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'STORAGE', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'TABLESPACE', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'CONSTRAINTS', true);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'REF_CONSTRAINTS', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'CONSTRAINTS_AS_ALTER', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'OID', false);
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SIZE_BYTE_KEYWORD', false);
-- Introduced collation in Oracle RDBMS 18.c, comment following line in earlier database
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'COLLATION_CLAUSE', 'NEVER');
SELECT
'ALTER TABLE "'||tableName||'" ADD '||regexp_replace(regexp_substr(dbms_metadata.get_ddl('TABLE', tableName), '"'||columnName||'"[^"]*'), '[,)] $','') into outStr
FROM dual;
RETURN outStr;
END get_column_ddl;
/
get_column_ddl()
函数用法:CREATE TABLE test_1 (
id NUMBER GENERATED ALWAYS AS IDENTITY,
description VARCHAR2(100) DEFAULT 'Undefined' NOT NULL
);
select get_column_ddl('TEST_1','ID') from dual
union
select get_column_ddl('TEST_1','DESCRIPTION') from dual;
get_column_ddl()
函数返回:ALTER TABLE "TEST_1" ADD "ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE NOT NULL ENABLE
ALTER TABLE "TEST_1" ADD "DESCRIPTION" VARCHAR2(100) DEFAULT 'Undefined' NOT NULL ENABLE
注意包含
contraints
和defaults
。
get_column_ddl()
功能限制:此解决方案将不提供
collation
参数,将使用默认值 collation
(它是为 Oracle RDBMS 12 开发的)。
我认为以下查询可能对您有用。
SELECT *
FROM ADMIN.DDL_HISTORY_LOG L
WHERE L.OBJECT_TYPE = 'TABLE'
AND L.DDL = 'ALTER'
AND L.OBJECT_NAME = 'TABLE_NAME' --just change table name here
AND UPPER(L.DDL_SQL) LIKE '%ALTER%TABLE%ADD%'
AND UPPER(L.DDL_SQL) NOT LIKE '%ADD%CONSTRAINT%'
这个 oracle 字典保存了所有历史 DDL 语句。所以,如果你指定你的表名,你可以得到这个表过去所有的DDL语句。