Glue脚本中PySpark连接Oracle用query选项报ORA-00911错误
问题分析与解决方案
错误原因:SQL语句格式问题
ORA-00911是Oracle返回的"无效字符"错误,你的问题核心在于SQL字符串的引号处理不当:
- 原代码中
dnb_level =''LVL1''的双单引号写法,在Python字符串中会被解析为额外的单引号,导致Oracle无法识别合法的字符串常量格式。 - 即使是简单查询,若字符串定义时存在隐藏空格、换行或引号格式错误,也会触发同样的解析失败。
修复方案
1. 修正SQL字符串的引号转义
将var变量的定义改为以下两种正确格式之一:
# 用双引号包裹整个SQL,内部单引号直接使用 var = "select DNB_RESULTS_DTL_ID,REQUEST_ID,source_id,dnb_level from (select max(request_id) over(partition by org_code ) max_request_id,a.* from XXGMDMADM.MDM_DNB_RESULTS_DTL a where dnb_level = 'LVL1' and request_id in (131) ) where MAX_REQUEST_ID=request_id"
或者:
# 用单引号包裹SQL,内部单引号用反斜杠转义 var = 'select DNB_RESULTS_DTL_ID,REQUEST_ID,source_id,dnb_level from (select max(request_id) over(partition by org_code ) max_request_id,a.* from XXGMDMADM.MDM_DNB_RESULTS_DTL a where dnb_level = \'LVL1\' and request_id in (131) ) where MAX_REQUEST_ID=request_id'
2. 验证简单查询的正确性
测试用的简单查询需确保格式严谨,无多余字符:
var = "select DNB_RESULTS_DTL_ID,REQUEST_ID,source_id,dnb_level from XXGMDMADM.MDM_DNB_RESULTS_DTL"
关于query选项对Oracle的支持性
Spark JDBC的query选项对Oracle完全生效,它允许执行自定义SQL查询而非仅读取整张表。你的问题并非选项本身不兼容,而是SQL字符串格式错误导致Oracle解析失败,只要SQL语句符合Oracle语法规范,就能正常返回数据。
内容的提问来源于stack exchange,提问作者pbh
相关产品推荐
相关产品推荐

