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

Python 2.7中如何将SQL*Plus输出转换为二维元组

解决SQL*Plus输出转二维元组的问题

我太懂这种痛苦了——SQLPlus默认的格式化输出简直是处理数据的噩梦!不过咱们可以通过调整SQLPlus的输出配置,再配合简单的字符串处理,完美转换成你想要的二维元组格式。

第一步:先让SQL*Plus输出结构化数据

首先修改你的SQL命令,添加几个SQL*Plus的环境设置,把输出改成用分隔符分隔的格式,彻底摆脱那些乱七八糟的对齐线和换行:

sqlCommand = """SET ECHO OFF
SET FEEDBACK OFF
SET HEAD ON
SET COLSEP '|'
SET LINESIZE 2000
SET TRIMSPOOL ON
SET TRIMOUT ON
SET UNDERLINE OFF
select PERSONID, PAYROLLNUMBER, EMPLOYEEPREFIX, LASTNAME, FIRSTNAME, MI, ACTIVE, UN_ID from <database-name-removed> where payrollnumber in (1111);
EXIT;
"""

给你解释下这些设置的作用:

  • SET ECHO OFF:不显示执行的命令本身
  • SET FEEDBACK OFF:去掉"X rows selected"这类没用的提示
  • SET HEAD ON:保留表头行
  • SET COLSEP '|':用竖线作为列分隔符,你可以换成任何不会出现在数据里的特殊符号(比如^或者|||)
  • SET LINESIZE 2000:设置足够宽的行宽,避免列内容被强制换行
  • SET TRIMSPOOL ON/SET TRIMOUT ON:自动去掉字段前后的空格
  • SET UNDERLINE OFF:直接干掉表头下面那条烦人的分隔线

第二步:编写输出解析函数

接下来修改你的查询函数,再新增一个解析输出的函数,把SQL*Plus返回的字符串转换成目标格式:

from subprocess import Popen, PIPE

def runSqlQuery(sqlCommand, connectString):
    # 添加text=True,直接返回字符串而非字节流,省得手动解码
    session = Popen(['sqlplus', '-S', connectString], stdin=PIPE, stdout=PIPE, stderr=PIPE, text=True)
    stdout, stderr = session.communicate(input=sqlCommand)
    return stdout, stderr

def parse_sqlplus_output(output):
    # 按行分割,过滤掉空行和无效行
    lines = [line.strip() for line in output.split('\n') if line.strip()]
    
    if not lines:
        return ()  # 空结果返回空元组
    
    # 解析表头:分割后去掉每个列名的多余空格
    headers = [col.strip() for col in lines[0].split('|')]
    # 解析数据行:分割后把空字段转成空字符串
    data_rows = []
    for line in lines[1:]:
        row = [col.strip() if col.strip() else '' for col in line.split('|')]
        data_rows.append(row)
    
    # 组合成二维元组返回
    return tuple([headers] + data_rows)

第三步:调用示例

现在你可以这样使用这套工具:

username = "你的用户名"
password = "你的密码"
connectString = f"{username}/{password}@SERVER"

# 这里用上面修改后的sqlCommand
queryResult, errorMessage = runSqlQuery(sqlCommand, connectString)

# 先检查错误
if errorMessage:
    print(f"执行出错:{errorMessage}")
else:
    result_tuple = parse_sqlplus_output(queryResult)
    print(result_tuple)

运行后你会得到完全符合预期的结果:

(['PERSONID', 'PAYROLLNUMBER', 'EMPLOYEEPREFIX', 'LASTNAME', 'FIRSTNAME', 'MI', 'ACTIVE', 'UN_ID'], ['11111', '99999', '', 'NEWMAN', 'ALFRED', '', '1', ''])

额外小提示

  • 如果你的数据里可能出现|,记得换成更特殊的分隔符,比如###
  • 这个方案支持多行数据返回,不管查出来几条记录都能正确解析
  • 一定要处理errorMessage,SQL语法错误或者权限问题都会在这里返回提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:42:44