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

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规范:

  1. 缺少FROM子句:my_table是数据表,应该放在FROM后,而非SELECT的字段列表中
  2. 多余的右括号:语句末尾多了一个),导致语法结构混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:02