Oracle Schema视图脚本完整导出问题求助
Oracle导出完整视图定义的解决方法
问题原因
ALL_VIEWS中的TEXT列在Oracle 11g及以前为VARCHAR2(4000),12c+虽改为CLOB类型,但多数客户端工具默认仅截取前4000字符进行显示或导出,导致视图脚本被截断。
解决方法
1. 调整客户端工具的显示/导出设置
- PL/SQL Developer:依次点击「工具→首选项→SQL窗口」,增大「最大字符数」;导出时选择「导出查询结果」,格式选CSV或Excel,在导出选项中勾选完整导出长字段。
- SQL Developer:依次点击「工具→首选项→数据库→高级」,调大「SQL数组获取大小」;导出时选择「导出为CSV」,勾选「包含CLOB数据」并设置长字段最大长度。
2. 使用DBMS_METADATA.GET_DDL获取完整DDL
Oracle内置的DBMS_METADATA包可直接获取对象的完整定义,不受字段长度限制,查询语句如下:
SELECT owner, view_name, DBMS_METADATA.GET_DDL('VIEW', view_name, owner) AS full_view_ddl FROM all_views WHERE owner LIKE '%SCHEMA_NAME%';
如果要直接导出到文件,可在SQL*Plus中执行以下命令:
-- 设置CLOB显示长度,确保完整输出 SET LONG 999999 SET LONGCHUNKSIZE 999999 SET LINESIZE 200 -- 启动导出到文件 SPOOL views_ddl.txt SELECT DBMS_METADATA.GET_DDL('VIEW', view_name, owner) FROM all_views WHERE owner LIKE '%SCHEMA_NAME%'; -- 结束导出 SPOOL OFF
3. 逐条迭代导出(解决内存问题)
若一次性导出所有视图占用内存过高,可使用PL/SQL循环逐条处理并写入文件(需提前创建目录并授权):
DECLARE CURSOR c_views IS SELECT owner, view_name FROM all_views WHERE owner LIKE '%SCHEMA_NAME%'; v_ddl CLOB; v_file UTL_FILE.FILE_TYPE; BEGIN -- 需提前创建目录:CREATE DIRECTORY OUT_DIR AS '/your/output/path'; -- 给当前用户授权:GRANT WRITE ON DIRECTORY OUT_DIR TO your_username; v_file := UTL_FILE.FOPEN('OUT_DIR', 'views_ddl.txt', 'W'); FOR rec IN c_views LOOP v_ddl := DBMS_METADATA.GET_DDL('VIEW', rec.view_name, rec.owner); -- 写入视图标识和DDL UTL_FILE.PUT_LINE(v_file, '--- ' || rec.owner || '.' || rec.view_name || ' ---'); UTL_FILE.PUT_LINE(v_file, v_ddl); UTL_FILE.PUT_LINE(v_file, CHR(10)); END LOOP; UTL_FILE.FCLOSE(v_file); EXCEPTION WHEN OTHERS THEN IF UTL_FILE.IS_OPEN(v_file) THEN UTL_FILE.FCLOSE(v_file); END IF; RAISE; END; /
内容的提问来源于stack exchange,提问作者Rabers




