如何用sqlplus生成Oracle表的INSERT语句?尝试exp命令未成功
用SQLPlus生成Oracle表的INSERT语句的几种方法
嘿,我完全懂你的需求——之前用exp命令生成的DMP文件是Oracle的物理备份格式,没法直接拿到可读的INSERT语句,确实不是你想要的。下面给你几个在SQLPlus里就能搞定的实用方法:
方法1:手动拼接INSERT语句(适合简单场景)
如果你的表结构不复杂,直接写个SELECT语句把字段和值拼合成INSERT语法就行。比如针对你的name_table,可以这么写:
-- 先设置SQLPlus输出参数,去掉多余的表头、空行等干扰内容 SET HEADING OFF; SET ECHO OFF; SET PAGESIZE 0; SET FEEDBACK OFF; SET VERIFY OFF; SET LINESIZE 1000; -- 替换成你的表名和实际列名 SELECT 'INSERT INTO name_table (col1, col2, col3) VALUES (''' || REPLACE(col1, '''', '''''') || ''', ''' || -- 处理字符串里的单引号,避免SQL语法错误 REPLACE(col2, '''', '''''') || ''', ' || col3 || ');' -- 数字类型无需加单引号 FROM name_table;
注意点:
- 不同数据类型要对应处理:字符串需包裹单引号,数字直接拼接,日期可以用
TO_CHAR(col_date, ''YYYY-MM-DD HH24:MI:SS'')转成标准字符串再拼接 - 如果字段本身包含单引号(比如
O'Neil),一定要用REPLACE函数把单个单引号替换成两个,否则SQL执行会报错
方法2:用DBMS_METADATA包(官方推荐,自动处理所有类型)
Oracle自带的DBMS_METADATA包可以一键生成表的DDL和INSERT语句,省心还能自动适配各种数据类型。在SQLPlus里执行:
-- 设置输出长度,避免长语句被截断 SET LONG 1000000; SET PAGESIZE 0; SET FEEDBACK OFF; SET VERIFY OFF; -- 可选:生成表结构的DDL语句 SELECT DBMS_METADATA.GET_DDL('TABLE', 'NAME_TABLE') FROM DUAL; -- 生成表中所有数据的INSERT语句 SELECT DBMS_METADATA.GET_INSERT('TABLE', 'NAME_TABLE') FROM DUAL;
注意点:
- Oracle默认对象名为大写,所以这里的
NAME_TABLE要和实际表名大小写一致;如果你的表名是小写,需要加双引号:"name_table" - 如果要把输出保存到文件,用SQLPlus的
SPOOL命令即可:
执行后,SPOOL insert_output.sql -- 执行上面的GET_INSERT语句 SPOOL OFFinsert_output.sql文件里就会保存所有生成的INSERT语句
为什么之前的exp命令不行?
exp是Oracle传统的导出工具,它生成的.dmp是二进制备份文件,主要用于通过imp命令恢复数据到数据库,并非可读的文本格式INSERT语句,所以不符合你的需求。
内容的提问来源于stack exchange,提问作者Jose Sabater
相关产品推荐
相关产品推荐

