【问题标题】:problem when running SQL Oracle command with ROWID使用 ROWID 运行 SQL Oracle 命令时出现问题
【发布时间】:2021-01-08 11:20:32
【问题描述】:

我正在尝试执行以下操作,在 TOAD 中选择,但是出现错误:ORA-00933 SQL 命令未关闭命名

SELECT ROWID,
       ECM_WF_PROC.IDWF_PROC, 
       ECM_WF_PROC.PROCESSO, 
       TD_DADOS_ETAPAS.SITUACAO, 
       TD_DADOS_ETAPAS.DATAINICIAL, 
       TD_DADOS_ETAPAS.DATAFINAL, 
       TD_DADOS_ETAPAS.DATAPREVISTA
  FROM ECM_WF_PROC AS ECM_WF_PROC_ETAPAS,
  LATERAL(SELECT ECM_WF_PROC_ETAPAS.SITUACAO AS SITUACAO, 
                 ECM_WF_PROC_ETAPAS.DATAINICIAL AS DATAINICIAL, 
                 ECM_WF_PROC_ETAPAS.DATAFINAL AS DATAFINAL, 
                 ECM_WF_PROC_ETAPAS.DATAPREVISTA AS DATAPREVISTA
            FROM ECM_WF_PROC_ETAPAS AS ECM_WF_PROC_ETAPAS
           WHERE ECM_WF_PROC_ETAPAS.IDEMPRESA = ECM_WF_PROC.IDEMPRESA AND
                 ECM_WF_PROC_ETAPAS.IDWF_PROC = ECM_WF_PROC.IDWF_PROC) AS TD_DADOS_ETAPAS
WHERE ECM_WF_PROC.PROCESSO = '177920';

https://i.imgur.com/B54ZK2A.png

你能帮我解决一下吗?

【问题讨论】:

    标签: sql oracle toad


    【解决方案1】:

    ROWID 指的是某行的地址,因此您应该提供表的名称,以便 Oracle 了解在您的 FROM 子句中的多个表中,它应该为 ROWID 考虑哪个表。

    使用ECM_WF_PROC_ETAPAS.ROWID

    【讨论】:

      【解决方案2】:

      这个特定问题 (ORA-00933) 的原因是 from 子句中的 as 关键字。与其他一些数据库不同,在 Oracle 中它会引发错误。例如:

      SQL> select *
        2  from dept as d
        3  where deptno = 10;
      from dept as d
                *
      ERROR at line 2:
      ORA-00933: SQL command not properly ended
      

      查看 SQL*Plus 如何很好地显示错误发生的位置?您的 TOAD GUI 也是如此 - 将 as 涂成蓝色。

      没有as

      SQL> select *
        2  from dept d
        3  where deptno = 10;
      
          DEPTNO DNAME          LOC
      ---------- -------------- -------------
              10 ACCOUNTING     NEW YORK
      
      SQL>
      

      在你的情况下,你会修改

      FROM ECM_WF_PROC AS ECM_WF_PROC_ETAPAS
      ...
                     ) AS TD_DADOS_ETAPAS
      

      FROM ECM_WF_PROC    ECM_WF_PROC_ETAPAS
      ...
                     )    TD_DADOS_ETAPAS
      

      【讨论】:

        【解决方案3】:

        我很好奇为什么在简单的内部连接似乎足够的情况下使用横向连接:

        SELECT ECM_WF_PROC.ROWID,
               ECM_WF_PROC.IDWF_PROC, 
               ECM_WF_PROC.PROCESSO, 
               TD_DADOS_ETAPAS.SITUACAO, 
               TD_DADOS_ETAPAS.DATAINICIAL, 
               TD_DADOS_ETAPAS.DATAFINAL, 
               TD_DADOS_ETAPAS.DATAPREVISTA
        FROM ECM_WF_PROC ECM_WF_PROC_ETAPAS JOIN
             FROM ECM_WF_PROC_ETAPAS TD_DADOS_ETAPAS
             ON TD_DADOS_ETAPAS.IDEMPRESA = ECM_WF_PROC.IDEMPRESA AND
                TD_DADOS_ETAPAS.IDWF_PROC = ECM_WF_PROC.IDWF_PROC
        WHERE ECM_WF_PROC.PROCESSO = '177920';
        

        正如其他两个答案所指出的,ROWIDAS 都是问题。横向连接应该起作用,但是当一个简单的INNER JOIN 就足够时使用它似乎很尴尬。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-12
          • 2011-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-02
          • 2019-03-16
          相关资源
          最近更新 更多