早上一个同事资讯怎么获取到建表语句而且是不带存储那种SQL。
Oracle自己提供了一个函数DBMS_METADATA.GET_DDL,但是获取到的建表语句含有存储、表空间、以及一些其他段的属性。
如图:
看到这个获取到的ddl语句,想通过利用Oracle函数来截取的方式获取建表语句。
思路为:
1.通过get_ddl获取建表语句 abc
2.将abc中的pctfree'替换成';'
3.计算';'的位置
4.用substr来截取abc,从开头到';'的长度
SQL如下:
SELECT SUBSTR(REPLACE(DBMS_METADATA.GET_DDL('TABLE', 'SALES', 'SH'),
'PCTFREE', ';'),1, INSTR(REPLACE(DBMS_METADATA.GET_DDL('TABLE', 'SALES', 'SH'), 'PCTFREE', ';'),';', 1)) FROM DUAL;复制
刚开始也确实以为解决了问题,如图:
但是当语句中含有索引的属性的时候,会出现问题,因为索引自己也有pctfree等相关属性,所以截取的时候直接截取错了,如图:
最后没办法,还是老老实实用函数来解决吧。
函数如下:
CREATE OR REPLACE FUNCTION FUN_GET_TABLE_DDL(P_SCHEMA IN VARCHAR2, P_TABLE_NAME IN VARCHAR2)
RETURN CLOB IS V_CLOB CLOB;
BEGIN 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, 'SEGMENT_ATTRIBUTES',FALSE);
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME, P_SCHEMA) INTO V_CLOB FROM DUAL; V_CLOB := REPLACE(V_CLOB, '"');
IF INSTR(V_CLOB, 'PRIMARY KEY', 1, 1) <> 0 THEN V_CLOB := REPLACE(V_CLOB, ';', ');');
END IF;
RETURN V_CLOB; EXCEPTION WHEN OTHERS THEN RAISE;
END;复制
使用如图:
文章转载自科学家的炼丹房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1319次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
790次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
721次阅读
2025-03-06 09:41:49
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
DarkAthena
577次阅读
2025-03-04 14:33:31
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
541次阅读
2025-03-05 00:42:34
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
462次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
460次阅读
2025-03-04 21:56:13
【ORACLE】char类型和sql优化器发生的“错误”反应
DarkAthena
411次阅读
2025-03-04 23:05:01
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
351次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
312次阅读
2025-03-26 23:27:33