Oracle中ROW_NUMBER()使用问题:Spark JDBC报ORA-00923错误
问题解决:Spark JDBC连接Oracle时ROW_NUMBER()语句报错ORA-00923
问题场景
通过Spark JDBC连接PostgreSQL和Oracle数据库,将以下SQL语句配置到dbtable参数时:
select ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RNO, my_table) AS subQuery
PostgreSQL可正常执行,但Oracle抛出错误:
Caused by: OracleDatabaseException: ORA-00923: FROM keyword not found where expected
已知Oracle支持ROW_NUMBER()函数,却无法定位错误原因。相关Spark代码如下:
val reader = spark.read .format("jdbc") .option("url", "location") .option("dbtable", ("select ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RNO, my_table) AS subQuery")) // 后续代码省略
错误原因
你的SQL语句存在语法错误,不符合标准SQL规范:
- 缺少
FROM子句:my_table是数据表,应该放在FROM后,而非SELECT的字段列表中 - 多余的右括号:语句末尾多了一个
),导致语法结构混乱
PostgreSQL对非标准SQL的容错性较高,所以能勉强运行,但Oracle的语法检查更严格,直接抛出语法错误。
修正后的SQL语句
将数据表放到FROM子句中,修正括号结构,正确的SQL如下(作为子查询供dbtable使用):
(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RNO, t.* FROM my_table t) AS subQuery
如果需要指定特定字段,可把t.*替换为具体字段名。
修正后的Spark代码
val reader = spark.read .format("jdbc") .option("url", "your_oracle_url") .option("dbtable", "(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RNO, t.* FROM my_table t) AS subQuery") .option("user", "your_username") .option("password", "your_password") .load()
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

