You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 OFF
    
    执行后,insert_output.sql文件里就会保存所有生成的INSERT语句

为什么之前的exp命令不行?

exp是Oracle传统的导出工具,它生成的.dmp是二进制备份文件,主要用于通过imp命令恢复数据到数据库,并非可读的文本格式INSERT语句,所以不符合你的需求。

内容的提问来源于stack exchange,提问作者Jose Sabater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:55