【问题标题】:Cx_Oracle (Python3.6) SQL query GROUP BY causing ValueError - runs fine in SQL DeveloperCx_Oracle (Python3.6) SQL 查询 GROUP BY 导致 ValueError - 在 SQL Developer 中运行良好
【发布时间】:2017-11-11 19:06:42
【问题描述】:

系统信息:

print(cx_Oracle.clientversion())    
(12, 2, 0, 1, 0)
print(cx_Oracle.version) 
6.0b2
print(sys.version)
3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]

我正在运行一个查询,它在 SQL Developer 中可以正常运行,但是在使用 cx_Oracle 在 python 中运行时会引发错误。它似乎与 GROUP BY 子句有某种关系,因为当 SUMGROUP BY 被删除时,查询在 cx_Oracle 中运行。

SQL 命令:

SELECT prop_code, forecast, sum(uc_fc) as remaining_fc
FROM my_table
WHERE
prop_code = 'MYPROP'
AND stay_Date = '01-MAY-17'
GROUP BY prop_code, forecast;

SQL Developer 中的返回:

+-------------+------------+-------------------------+
| "PROP_CODE" | "FORECAST" |     "REMAINING_FC"      |
+-------------+------------+-------------------------+
| MYPROP      |         17 | 3858.2210740962656178   |
| MYPROP      |          8 | 4599.4697955023602118   |
| MYPROP      |          4 | 798.79072149551767364   |
| MYPROP      |          7 | 1096.30162478218624302  |
| MYPROP      |         18 | 4016.37933889910515332  |
| MYPROP      |          1 | 4793.6514493804123866   |
| MYPROP      |          2 | 10070.756632866636683   |
| MYPROP      |          3 | 29910.550761344399349   |
| MYPROP      |          5 | 1820.4588262721241473   |
| MYPROP      |          6 | 15406.887917698571224   |
| MYPROP      |         99 | 3846.232477937824844934 |
+-------------+------------+-------------------------+

python中的SQL查询:

forecast_query = '''SELECT prop_code, forecast, \
sum(uc_fc) as remaining_fc \
FROM OY_UNC_STYDT_FCST_UPD_ARCH \
WHERE prop_code = 'MYPROP' \
AND stay_Date = '01-MAY-17' \
GROUP BY prop_code, forecast'''

以及运行它的代码:

start = time.time()
my_dsn = cx_Oracle.makedsn(host='myhost', port=1560, sid='mysid')
con = cx_Oracle.Connection(user= 'username', password='pass', dsn = my_dsn)
cur = con.cursor()
cur.execute(forecast_query)
forecast_results = cur.fetchall()
con.close()

返回此错误:

ValueError: invalid literal for int() with base 10: '3858.2210740962656178'

感谢您的帮助!

【问题讨论】:

  • 问题好像是这里描述的:orafaq.com/aggregator/sources/450你可以尝试使用to_char(sum(uc_fc))吗?
  • 好发现!那是完全相同的问题。 to_char 确实有效。也使用cast 作为float 工作但消除了一些精度。我猜这必须是由于浮点数太多,python无法处理。
  • 很高兴能帮上忙! :-)

标签: python sql oracle oracle-sqldeveloper cx-oracle


【解决方案1】:

我能够通过强制将 CAST 作为 float 参数到我想要求和的列来运行它。我不确定为什么 cx_Oracle 不能处理查询。可能是一个错误?

有效的 SQL 查询:

forecast_query = '''SELECT prop_code, demand_forecast_segment_id, \
cast(sum(uc_fc) as float) as remaining_fc \
FROM MY_TABLE\
WHERE prop_code = 'MYPROP' \
AND stay_Date = '01-MAY-17' \
GROUP BY prop_code, forecast'''

【讨论】:

    【解决方案2】:

    这是由于模块中的错误导致的,该错误已得到修复。看到这个问题:https://github.com/oracle/python-cx_Oracle/issues/34

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多