客户端等工具可获取完整表定义、索引、外键、注释等
但系统过程无对应完整获取路径,需自行单独获取表、索引、注释等信息,编写过程可拼接获取表对象的完整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');
文章
阅读量
获赞
