oracle “ORA-00923:在预期的位置未找到FROM关键字\n应如何修复

3zwjbxry  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(277)

我有一个oracle查询,如下所示,但是当我对分页进行更改时,结果是不同的。

SELECT *
FROM (
  SELECT b.*,
         ROWNUM r__
  FROM (
    select a.KODE_KLAIM,
           a.NO_SS,
           a.LA,
           a.NAMA_TK,
           a.KODE_K,
           (
             select tk.TEM_LAHIR
             from KN.VW_KN_TK tk
             where tk.KODE_K = a.KODE_K and rownum=1
           ) TEM_LAHIR,
           (
             select TO_CHAR(tk.TLAHIR, 'DD/MM/RRRR')
             from KN.VW_KTK tk
             where tk.KODE_K = a.KODE_K
             and rownum=1
           ) TLAHIR
    from PN.KLAIM a
    where nvl(a.STATUS_BATAL,'X') = 'T'
    and A.NOMOR IS NOT NULL
    and A.TIPE_KLAIM = 'JPN01'
  )b
)
where 1 = 1
WHERE ROWNUM < ( ( ? * ? ) + 1 )
WHERE r__ >= ( ( ( ? - 1 ) * ? ) + 1 )

但是我运行了这个查询,结果是ORA-00900:无效的SQL语句

8i9zcol2

8i9zcol21#

结尾有三个WHERE子句(没有ORDER BY子句)。要使其语法有效,可以将第二个和第三个WHERE子句更改为AND
但是,您提到了分页,因此您可能希望用途:

SELECT *
FROM (
  SELECT b.*,
         ROWNUM r__
  FROM (
    select ...
    from   ...
    ORDER BY something
  )b
  WHERE ROWNUM < :page_size * :page_number + 1
)
WHERE r__ >= ( :page_number - 1 ) * :page_size + 1
  • 注意:如果需要,可以将命名绑定变量替换为匿名绑定变量。*

或者,如果您使用的是Oracle 12或更高版本,则可以使用OFFSET x ROWS FETCH FIRST y ROWS ONLY语法:

select ...
from   ...
ORDER BY something
OFFSET (:page_number - 1) * :page_size ROWS
FETCH FIRST :page_size ROWS ONLY;

此外,您还有几个相关子查询,例如:

select tk.TEM_LAHIR
from   KN.VW_KN_TK tk
where  tk.KODE_K = a.KODE_K and rownum=1

这将查找SQL引擎碰巧从数据文件中读取的第一个匹配行,并且实际上是查找随机行。如果需要特定行,则需要ORDER BY子句,并且需要使用ROWNUMAFTER(在应用ORDER BY子句之后)进行筛选。
在Oracle 12中,相关子查询将是:

select tk.TEM_LAHIR
from   KN.VW_KN_TK tk
where  tk.KODE_K = a.KODE_K
ORDER BY something
FETCH FIRST ROW ONLY

相关问题