如何从PostgreSQL导出指定列的SQL脚本以导入Oracle?
导出PostgreSQL指定列生成Oracle兼容的SQL插入脚本
因为只有100多行数据,用纯SQL/命令行方式完全可行,下面提供几种直接生成Oracle格式INSERT语句的方案:
方案1:用psql直接拼接生成INSERT语句
直接在psql中通过SELECT拼接Oracle风格的插入语句,输出到文件即可,这种方式能精准控制列和格式,还能自动处理字符串转义:
psql -d 你的PG数据库名 -U 用户名 -c " SELECT 'INSERT INTO oracle目标表名(列1, 列2, 列3) VALUES(' || COALESCE(quote_literal(列1), 'NULL') || ', ' || COALESCE(quote_literal(列2), 'NULL') || ', ' || COALESCE(quote_literal(列3), 'NULL') || ');' FROM PG源表名 WHERE 筛选条件; " > oracle_inserts.sql
细节说明:
quote_literal():自动处理字符串中的单引号转义,避免SQL语法错误COALESCE(..., 'NULL'):把PostgreSQL的NULL值转换成INSERT语句中的NULL关键字,而不是字符串'NULL'- 如果是数字、日期类型,可根据Oracle的要求调整:比如日期类型可以用
TO_CHAR(日期列, 'YYYY-MM-DD HH24:MI:SS')再套quote_literal(),确保Oracle能识别
方案2:用pg_dump生成插入脚本后转成Oracle格式
利用pg_dump指定列导出INSERT语句,再批量替换表名和格式(100多行的话,手动或简单sed替换都很快):
- 导出PG指定列的INSERT脚本:
pg_dump -d 你的PG数据库名 -U 用户名 \ --table=PG源表名 \ --columns=列1,列2,列3 \ --data-only \ --inserts \ --where="筛选条件" \ > pg_inserts.sql
- 替换成Oracle兼容的格式:
# 替换表名 sed 's/INSERT INTO "PG源表名"/INSERT INTO oracle目标表名/g' pg_inserts.sql > oracle_inserts.sql # 如果有PostgreSQL特定语法(比如序列nextval),按需删除或替换 sed -i 's/DEFAULT nextval.*//g' oracle_inserts.sql
方案3:CSV转INSERT(适合需要先验证数据的场景)
如果已经用COPY导出了指定列的CSV,可通过PostgreSQL读取CSV再生成INSERT,或者用简单的命令行工具处理:
用PostgreSQL处理CSV生成INSERT:
# 先导出CSV psql -d 你的PG数据库名 -U 用户名 -c " COPY (SELECT 列1,列2,列3 FROM PG源表名 WHERE 筛选条件) TO '/tmp/data.csv' WITH (FORMAT csv, HEADER, DELIMITER ',', QUOTE '"'); " # 读取CSV生成INSERT psql -d 你的PG数据库名 -U 用户名 -c " CREATE TEMP TABLE tmp_data (列1 类型, 列2 类型, 列3 类型); COPY tmp_data FROM '/tmp/data.csv' WITH (FORMAT csv, HEADER); SELECT 'INSERT INTO oracle目标表名(列1,列2,列3) VALUES(' || COALESCE(quote_literal(列1), 'NULL') || ', ' || COALESCE(quote_literal(列2), 'NULL') || ', ' || COALESCE(quote_literal(列3), 'NULL') || ');' FROM tmp_data; " > oracle_inserts.sql
用awk快速处理CSV(适合无复杂转义的场景):
awk -F ',' 'NR>1 { gsub(/'\''/, '\'\'\'\'', $1); gsub(/'\''/, '\'\'\'\'', $2); gsub(/'\''/, '\'\'\'\'', $3); print "INSERT INTO oracle目标表名(列1,列2,列3) VALUES('\''"$1"'\'', '\''"$2"'\'', '\''"$3"'\'');"; }' /tmp/data.csv > oracle_inserts.sql
注:gsub(/'/, ''', $1)是处理字段中的单引号,转义成Oracle支持的两个单引号。
内容的提问来源于stack exchange,提问作者elbarna
相关产品推荐
相关产品推荐

