gpt4 book ai didi

oracle - 如何使 dbms_metadata.get_ddl 更漂亮/有用

转载 作者:行者123 更新时间:2023-12-03 23:54:50 25 4
gpt4 key购买 nike

我正在创建一个包来在我的模式中生成对象的 DDL(您解析对象名称,并使用 DDL 返回 clob),因此我可以生成文件,并将它们直接放入 SVN。

我正在使用 dbms_metadata.get_ddl ,它适用于除表/物化 View 之外的所有对象。

如果我创建一个表:

create table stackoverflow
( col_1 varchar2(64)
, col_2 number
, col_3 date);

create index idx_test on stackoverflow(col_1);

alter table stackoverflow add constraint ui_test unique (col_2) using index;

并使用以下命令生成 DDL:
begin
dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE'
, name => 'STACKOVERFLOW')
);
end;

它给了我们:
CREATE TABLE "TEST_SCHEMA"."STACKOVERFLOW" 
( "COL_1" VARCHAR2(64),
"COL_2" NUMBER,
"COL_3" DATE,
CONSTRAINT "UI_TEST" UNIQUE ("COL_2")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS_DATA_TS" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS_DATA_TS"

要获取所有相关索引,我们可以使用:
begin
dbms_output.put_line(dbms_metadata.get_dependent_ddl( object_type => 'INDEX'
, base_object_name => 'STACKOVERFLOW'));
end;

具有:
CREATE INDEX "TEST_SCHEMA"."IDX_TEST" ON "MF"."STACKOVERFLOW" ("COL_1") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS_DATA_TS"
CREATE UNIQUE INDEX "TEST_SCHEMA"."UI_TEST" ON "MF"."STACKOVERFLOW" ("COL_2")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS_DATA_TS"

我想创建一个文件,其中包含:创建表、约束、索引、授权(拥有一个需要所有定义的文件)并使用 dbms_metadata这对我来说似乎是不可能的。

我的输出问题是:
  • 名称的双引号
  • DDL 中的模式名称使我们难以跨多个模式编译相同的 DDL。要解决这个问题,我们需要创建一些 for of regex 或添加类似以下内容的内容可以解决这个问题:
     dbms_metadata.SET_REMAP_PARAM(dbms_metadata.SESSION_TRANSFORM,'REMAP_SCHEMA','TEST_SCHEMA','');

    但是您必须再添加 8 行:
    hOpenOrig0 := DBMS_METADATA.OPEN('TABLE');
    DBMS_METADATA.SET_FILTER(hOpenOrig0,'NAME',p_object_name);
    DBMS_METADATA.SET_FILTER(hOpenOrig0,'SCHEMA',get_table.owner);
    tr := dbms_metadata.add_transform(hOpenOrig0, 'MODIFY');
    hTransDDL := DBMS_METADATA.ADD_TRANSFORM(hOpenOrig0,'DDL');
    dbms_metadata.set_remap_param(tr, name => 'REMAP_SCHEMA', old_value => user, new_value => '');
    get_package_spec.ddl := DBMS_METADATA.FETCH_CLOB(hOpenOrig0);
    DBMS_METADATA.CLOSE(hOpenOrig0);
  • 无法同时提取约束(使用索引)和索引。由于 ui_test 的重复定义,您无法连接输出.是的,可以选择从 get_ddl 中删除约束。但我们正在失去约束/检查。
  • PL/SQL Developer 如何创建输出
    -- Create table
    create table STACKOVERFLOW
    (
    col_1 VARCHAR2(64),
    col_2 NUMBER,
    col_3 DATE
    )
    tablespace USERS_DATA_TS
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
    initial 128K
    next 128K
    minextents 1
    maxextents unlimited
    pctincrease 0
    );
    -- Create/Recreate indexes
    create index IDX_TEST on STACKOVERFLOW (COL_1)
    tablespace USERS_DATA_TS
    pctfree 10
    initrans 2
    maxtrans 255
    storage
    (
    initial 128K
    next 128K
    minextents 1
    maxextents unlimited
    pctincrease 0
    );
    -- Create/Recreate primary, unique and foreign key constraints
    alter table STACKOVERFLOW
    add constraint UI_TEST unique (COL_2)
    using index
    tablespace USERS_DATA_TS
    pctfree 10
    initrans 2
    maxtrans 255
    storage
    (
    initial 128K
    next 128K
    minextents 1
    maxextents unlimited
    pctincrease 0
    );

  • 有人知道创建类似于 PL/SQL Developer 的输出的方法吗?我猜他们创建了一些 dbms_metadata.get_xml 的 XML 解析器) 创建一个更漂亮的版本(缩进,顺序,一切都很好,准备在任何地方编译)。

    当然我可以玩正则表达式或 user_indexes但这不是重点。

    附: DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);什么是“漂亮”是一个奇怪的定义。

    最佳答案

    dbms_metadata.get_dll 将 oracle 对象作为 xml 获取,然后通过 xslt 将其转换为 ddl 脚本。

    有用表列表select table_name from all_tables where table_name like 'META%' .

  • METASTYLESHEET - 将样式表映射到它的名称
  • METAXSL$ - 将 XMLTAG 映射到样式表名称 - 将其链接到第一个表
  • METAVIEW$ - 将对象类型映射到 XMLTAG - 将其链接到第二个表
  • METAXSLPARAM$ - 每个对象类型和转换类型可用的转换过滤器的查找表。

  • 对于表 oracle 使用 kutable for xml 到 ddl 作为索引 oracle 使用 kuindex ...等。

    通过设置参数,您可以更改转换行为。要找到有用的参数,请检查 METAXSLPARAM$ 表或在样式表文档中搜索它。
    EMIT_SCHEMA - 我在 kucommon xslt 中找到
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'EMIT_SCHEMA',false);  --undocumented remove schema
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_CREATION',false); --undocumented remove segement creation
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'CONSTRAINTS_AS_ALTER',true);
    select dbms_metadata.get_ddl( object_type => 'TABLE' , name => 'STACKOVERFLOW') from dual;

    关于oracle - 如何使 dbms_metadata.get_ddl 更漂亮/有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33897899/

    25 4 0