注册
获取表完整定义
专栏/技术分享/ 文章详情 /

获取表完整定义

Dora 2026/07/24 53 0 0
摘要

客户端等工具可获取完整表定义、索引、外键、注释等
但系统过程无对应完整获取路径,需自行单独获取表、索引、注释等信息,编写过程可拼接获取表对象的完整ddl

--创建测试表信息
CREATE TABLE "A01"
("C1" NUMBER(10,6) NOT NULL,
"COLUMN_2" NUMBER(10,1),
NOT CLUSTER PRIMARY KEY("C1"));
CREATE TABLE "TABLE_1"
("COLUMN_1" NUMBER(10,6) NOT NULL,
"COLUMN_2" NUMBER(10,1),
"C3" VARCHAR(4000),
NOT CLUSTER PRIMARY KEY("COLUMN_1"),
CONSTRAINT "ADAXA" FOREIGN KEY("COLUMN_1") REFERENCES "A01"("C1"),
CONSTRAINT "SDW123" UNIQUE("COLUMN_2"));
COMMENT ON TABLE "TABLE_1" IS '测试表';
COMMENT ON COLUMN "TABLE_1"."COLUMN_1" IS '字段1';
COMMENT ON COLUMN "TABLE_1"."COLUMN_2" IS '字段2';
CREATE  INDEX "11" ON "TABLE_1"("COLUMN_1" ASC);
CREATE  INDEX "33" ON "TABLE_1"("COLUMN_2" ASC);
CREATE OR REPLACE PROCEDURE SP_SHOW_TABLE_DEFINE ( SCH_NAME VARCHAR2 ( 500),
                                                   TAB_NAME VARCHAR2 ( 1000) )
AS
    /*索引编号传参*/
    V_INX_ID VARCHAR2(200);
    /*索引定义*/
    V_IDX_SQL VARCHAR2(1000);
    /*表结构+主键+外键+约束*/
    V_TAB_SQL VARCHAR2(8000);
    /*表及字段注释*/
    V_COM_SQL VARCHAR2(8000);
    /*打印的结果*/
    V_SQL_ALL VARCHAR DEFAULT '';
    /*游标*/
    V_CUR CURSOR;
BEGIN
    V_TAB_SQL = TABLEDEF(SCH_NAME, TAB_NAME);
    /*表结构+主键+外键+约束*/
    /*表及字段注释*/
    SELECT (SELECT LISTAGG(COMMENTS_1, CHAR(13))
              FROM ( SELECT 'COMMENT ON TABLE ' || T.SCHNAME || '.' || T.TVNAME || ' IS ''' || REPLACE(T.COMMENT$, '''', '''''') || ''';' AS COMMENTS_1
                      FROM SYSTABLECOMMENTS                                                                                                  T
                     WHERE SCHNAME = SCH_NAME
                       AND TVNAME = TAB_NAME
                   UNION
                   SELECT 'COMMENT ON COLUMN ' || C.SCHNAME || '.' || C.TVNAME || '.' || C.COLNAME || ' IS ''' || REPLACE(C.COMMENT$, '''', '''''') || ''';'
                     FROM SYSCOLUMNCOMMENTS C
                    WHERE SCHNAME = SCH_NAME
                      AND TVNAME = TAB_NAME ))
      INTO V_COM_SQL
      FROM DUAL;
    /*获取索引编号传参*/
    OPEN V_CUR FOR
    SELECT T2.OBJECT_ID
      FROM ALL_INDEXES T1,
           ALL_OBJECTS T2
     WHERE T1.OWNER = T2.OWNER
       AND T1.INDEX_NAME = T2.OBJECT_NAME
       AND T2.GENERATED = 'N'
       AND T1.OWNER = SCH_NAME
       AND T1.TABLE_NAME = TAB_NAME;
    /*获取索引编号传入*/
    LOOP
        /*索引编号传参*/
        FETCH V_CUR INTO V_INX_ID;
        EXIT WHEN V_CUR%NOTFOUND;
        /*索引定义获取*/
        SELECT ((SELECT *
                  FROM (SELECT INDEXDEF(V_INX_ID, 1) AS INDEX_1)
                 WHERE INDEX_1 <> '索引不存在'
                   AND INDEX_1 <> '禁止查看系统定义的索引信息' ))
          INTO V_IDX_SQL
          FROM DUAL ;
        /*索引定义V_IDX_SQL*/
        V_SQL_ALL = V_SQL_ALL || '' || CHAR(13) || V_IDX_SQL;
    END LOOP;
    /*拼接结果*/
    V_SQL_ALL = V_TAB_SQL || '' || V_SQL_ALL || '' || CHAR(13) || V_COM_SQL;
    SELECT V_SQL_ALL FROM DUAL;
END;
/
--传入模式名,表名信息
CALL "SP_SHOW_TABLE_DEFINE"('SYSDBA', 'TABLE_1');

image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服