plsql。有没有办法获得列 ddl?

问题描述 投票:0回答:2

我使用 dbms_metadata.get_ddl(...) 来获取对象 ddl 但它不会为列生成 ddl。 有没有办法获得列 ddl oracle 12 版本?

谢谢

oracle plsql oracle12c ddl
2个回答
0
投票

我必须自己解决这个问题

我创建了一个

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 开发的)。


-1
投票

我认为以下查询可能对您有用。

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语句。

© www.soinside.com 2019 - 2024. All rights reserved.