【问题标题】:ROWNUM returns as "invalid identifier"ROWNUM 作为“无效标识符”返回
【发布时间】:2015-06-10 13:55:05
【问题描述】:

我正在对一个 oracle 数据库运行一个非常基本的选择(不确定版本)。

SELECT * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE

我只想返回最近的记录。所以我试过了……

SELECT ROWNUM, * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE
SELECT * FROM ACCOUNTING WHERE ID = 123456 AND ROWNUM < 2 ORDER BY DATE

我每次都得到相同的结果...

Error Source: System.Data.OracleClient    
Error Message: ORA-00904: "ROWNUM" : invalid identifier

我看到和读到的一切都表明这应该有效。谁能看到我错过了什么?这可能是驱动程序的问题吗?我正在使用以下软件包...(Oracle ODAC 11.20.30 x64)

更新

感谢您的所有回复...对于我在努力简化场景时造成的任何混乱,我深表歉意。 ODAC 驱动程序实际上是在为我分解查询并对其进行格式化,所以我最初发布的不是完全正在运行的查询......这里的,特别是驱动程序正在吐出正在产生错误...

SELECT "ROWNUM", ID, SITE_ID, READING_DATE, SUBMITTED_DATE, DEPOSIT_DATE
FROM    ACCOUNTING
WHERE   (SITE_ID = 33730)
ORDER BY READING_DATE

对于我的第二次尝试......

SELECT ID, SITE_ID, READING_DATE, SUBMITTED_DATE, DEPOSIT_DATE
FROM    ACCOUNTING
WHERE   (SITE_ID = 33730) AND ("ROWNUM" < 2)
ORDER BY READING_DATE

【问题讨论】:

  • 你确定你从这些确切的查询中得到了那个错误吗?第一个应该得到 ORA-00936 因为你没有使用别名;第二个应该没问题(用您的实际列名替换保留字'DATE'),但如果没有子查询,它无论如何都不会完全符合您的要求。
  • 那么您是在双引号中引用 ROWNUM,还是自动为您执行此操作?如果是这样,你能说出它在做什么吗?
  • 我相信 ODAC 正在为我做这件事。我相信这应该将其与字段名称或值区分开来......以便将其识别为特殊命令。
  • 也许展示您如何创建和执行查询将有助于确定解决方案 - 也许是一个演示问题的简单程序?或者至少从您的原始查询到您可以看到已添加引号的位置,尽管连接设置中可能存在相关内容。我不使用 ODAC,但希望有人知道发生了什么——祝你好运。

标签: sql oracle odac


【解决方案1】:

您的实际查询可能在双引号内使用ROWNUM。否则,这个错误是不可能的。

虽然您的第一个查询是 ORA-00936: missing expression

select * from dual WHERE "ROWNUM" < =3;

Error report -
SQL Error: ORA-00904: "ROWNUM": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

ROWNUM 是一个伪列,它就像没有参数的函数.. 顺便说一下,"ROWNUM" 使 oracle 在您的表中搜索这样的列..

引用标识符 when 是 Oracle 保留关键字,将超出其原始用途,并表现为用户定义的列。

不确定如何阻止查询生成器以这种方式解释。我认为这是一个BUG

【讨论】:

  • 嗯,好电话,也许 ODAC 正在添加双引号?我敢肯定我以前见过这样做的东西,但我现在找不到它,也没有 ODAC 可以玩。也许有一个选项可以关闭自动报价。
  • 确实 ODAC 正在添加双引号......但它应该仍然有效,对吧?
  • @GaryO.Stenstrom ,ROWNUM 是一个伪列,它就像没有参数的函数.. 顺便说一句,"ROWNUM" 使 oracle 在您的表中搜索这样的列..
  • 感谢大家的回复。我将此标记为答案,因为它将问题确定为 ODAC 驱动程序。我安装了 SQL Developer,一切都按预期工作。我认为问题在于 ODAC 驱动程序不恰当地按摩 SQL。
【解决方案2】:

可以试试这个方法:

SELECT * FROM 
   (SELECT ROWNUM R, * FROM ACCOUNTING WHERE ID = 123456 ORDER BY DATE
) WHERE R < 2;

【讨论】:

    【解决方案3】:

    我相信当您选择包含 * 的以逗号分隔的列时,您需要为表设置别名。

    SELECT A.ROWNUM, A.* FROM ACCOUNTING A WHERE ID = 123456 ORDER BY DATE
    

    【讨论】:

      【解决方案4】:

      ROWNUM 在返回结果集后设置,是 Oracle 从表中选择行的顺序,因此您可以通过执行以下操作将输出限制为 10 行:

      ...
      FROM mytable
      where ROWNUM < 11;
      

      您不会使用它来获取最新记录。它不是表格中的一列,因此您收到了错误。

      https://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns009.htm#SQLRF00255

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多