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

Python调用SQLPlus查询Oracle导出规范CSV文件的问题求助

问题修复方案

核心错误原因

  • 语法错误:header定义中CITY未加字符串引号,会触发Python变量未定义报错
  • SQLPlus配置冲突:同时设置SET MARKUP CSV ON和SET colsep ,会导致输出格式混乱;SET linesize 2设置过小,会强制截断拆分行
  • 查询结构不匹配:两个SELECT语句返回列数分别为3列和1列,无法合并到同一个3列表头的CSV文件中
  • CSV写入逻辑错误:同时初始化两个不同分隔符的writer导致格式混乱;直接将完整的多行字符串传入writerow,csv.writer会将每个字符识别为单独列,才会出现单字母拆分到不同列的问题

可行修改方案

调整后的完整代码(保留单条多列查询逻辑,适配Excel打开)

import subprocess
from subprocess import Popen, PIPE
import csv

def run_sqlplus(sql_command, connect_string):
    session = Popen(['sqlplus','-S', connect_string], stdin=PIPE, stdout=PIPE, stderr=PIPE)
    (stdoutbytes, stderrbytes) = session.communicate(sql_command.encode('utf-8'))
    return (stdoutbytes.decode('utf-8'), stderrbytes.decode('utf-8'))

# 修正语法错误,给CITY加引号
header = ['NAME','AGE','CITY']
usr_file = 'Test.csv'
connect_string = 'user/pass@MYDB'
# 修正SQLPlus配置,删除冲突设置,调整合理参数
sql_command = """
SET HEADING OFF
SET colsep ,
SET pagesize 0
SET linesize 1000
SET numwidth 5
SET trimspool ON
SET feedback OFF
SELECT name,age,city from accounts where age > 50;
"""

query_result = run_sqlplus(sql_command, connect_string)
# 处理返回结果:按行拆分,去除空行,按逗号分割字段
result_rows = []
for line in query_result[0].splitlines():
    line = line.strip()
    if line:
        # 按逗号拆分字段,去除每个字段前后的空格
        fields = [f.strip() for f in line.split(',')]
        result_rows.append(fields)

with open(usr_file, 'w', encoding='utf-8-sig', newline='') as csvfile:
    # 只用一个writer,用逗号分隔符Excel可直接识别,加utf-8-sig编码避免中文乱码
    writer = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(header)
    writer.writerows(result_rows)

额外说明

如果需要保留两条查询的结果,建议分开导出到两个不同的CSV文件,避免列数不匹配导致的格式混乱。如果一定要合并到同一个文件,需要调整第二条查询的字段,补充两个空值占位,保证每行都是3列结构。

内容的提问来源于stack exchange,提问作者Mark T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:00