【问题标题】:SQL Oracle Error: ORA-00907: missing right parenthesisSQL Oracle 错误:ORA-00907:缺少右括号
【发布时间】:2018-07-18 17:43:14
【问题描述】:
Select m.CEAREGA, m.Crotal, rem.IdRexistro, m.IdMostraExt,
to_char(m.DataEntrega, 'DD/MM/YYYY') As Entrada, e.Descricion AS Ensaio,
to_char(rem.DataValidacion, 'DD/MM/YYYY') as DataValidacion, r.Descricion as Resultado, 
to_char(rem.Valor) as Valor, es.Descricion as Especie, tm.Descricion as Mostra,

(select LISTAGG(mo.Descricion, ':::') WITHIN GROUP (order by mo.Descricion)
from motivo_ensaio_mostra mm
join motivo_ensaio mo on mo.CodMotivo=mm.CodMotivo and mm.codLab=mo.codLab
where mm.IdRexistro=rem.IdRexistro and mm.IdMostra=rem.IdMostra and mm.CodLab=rem.CodLab
group by mm.IdRexistro, mm.IdMostra) as Motivo,

(select LISTAGG(trim(remi.NomeDesc || ' ' || remi.PrimeiroApelido || ' ' || remi.SegundoApelido), ':::') 
WITHIN GROUP (order by remi.PrimeiroApelido, remi.SegundoApelido, remi.NomeDesc)
from rexistro_remitente rm
join remitente remi on remi.NIFCIF=rm.NIFCIF and rm.codLab=remi.codLab
where rm.IdRexistro=rem.IdRexistro and rm.CodLab=rem.CodLab
group by rm.IdRexistro) as Remitente

from resultado_ensaio_mostra rem
join resultado r on r.CodResult=rem.CodResult and r.codLab = rem.codLab and r.CODTIPORESULT='P'
join mostra m on m.IdRexistro=rem.IdRexistro and m.IdMostra=rem.IdMostra and m.codLab = rem.codLab 
and m.VlxBaixa=0 and m.EstadoMostra<>10330004 and LENGTH(m.Crotal<5) and m.IdMostra > 201800000
join especie es on es.CodEspec=m.CodEspec and es.codLab = m.codLab
join tipo_mostra tm on tm.CodTipoMost=m.CodTipoMost and tm.codLab = m.codLab

显示 Oracle 错误:ORA-00907

我找不到缺少的括号或错误在哪里。谁能帮帮我?

提前致谢。

【问题讨论】:

  • 删除半查询。再试一次等​​。
  • LENGTH(m.Crotal&lt;5) 应该是LENGTH(m.Crotal)&lt;5
  • 如果您的查询格式正确,您找到错误的机会会大得多

标签: sql oracle oracle11g ora-00907


【解决方案1】:

多么丑陋的代码;试着习惯它的格式,这样维护起来更容易。

无论如何:错误来自AND LENGTH (m.Crotal &lt; 5) 行。

【讨论】:

    【解决方案2】:

    更改格式样式可能会有所帮助。

    对于子查询,我尝试保持左括号和右括号明显地相互关联。我倾向于将它们放在同一列中,并将子查询的内容缩进。

    同样,使每个谓词或计算彼此清楚地分开。我更喜欢将它们放在单独的行上,这样代码会更长,但代码会更窄;这对于diff (以及git)等工具更加友好

    这为我提供了以下内容,我可以比您的示例更快地进行可视化调试。 (事实上,我会说我无法直观地调试你的,每个单独的行或表达式都很难隔离和解析。)

    SELECT
      m.CEAREGA,
      m.Crotal,
      rem.IdRexistro,
      m.IdMostraExt,
      to_char(m.DataEntrega, 'DD/MM/YYYY') As Entrada,
      e.Descricion AS Ensaio,
      to_char(rem.DataValidacion, 'DD/MM/YYYY') as DataValidacion,
      r.Descricion as Resultado, 
      to_char(rem.Valor) as Valor,
      es.Descricion as Especie,
      tm.Descricion as Mostra,
      (
        select
          LISTAGG(mo.Descricion, ':::')
            WITHIN GROUP (order by mo.Descricion)
        from
          motivo_ensaio_mostra mm
        join
          motivo_ensaio mo
            on  mo.CodMotivo=mm.CodMotivo
            and mm.codLab=mo.codLab
        where
              mm.IdRexistro=rem.IdRexistro
          and mm.IdMostra=rem.IdMostra
          and mm.CodLab=rem.CodLab
        group by
          mm.IdRexistro, mm.IdMostra
      ) as Motivo,
      (
        select
          LISTAGG(trim(remi.NomeDesc || ' ' || remi.PrimeiroApelido || ' ' || remi.SegundoApelido), ':::') 
            WITHIN GROUP (order by remi.PrimeiroApelido, remi.SegundoApelido, remi.NomeDesc)
        from
          rexistro_remitente rm
        join
          remitente remi
            on  remi.NIFCIF=rm.NIFCIF
            and rm.codLab=remi.codLab
        where
              rm.IdRexistro=rem.IdRexistro
          and rm.CodLab=rem.CodLab
        group by
          rm.IdRexistro
      ) as Remitente
    from
      resultado_ensaio_mostra rem
    join
      resultado r
        on  r.CodResult = rem.CodResult
        and r.codLab = rem.codLab
        and r.CODTIPORESULT='P'
    join
      mostra m
        on  m.IdRexistro = rem.IdRexistro
        and m.IdMostra = rem.IdMostra
        and m.codLab = rem.codLab 
        and m.VlxBaixa=0
        and m.EstadoMostra<>10330004
        and LENGTH(m.Crotal<5)
        and m.IdMostra > 201800000
    join
      especie es
        on  es.CodEspec=m.CodEspec
        and es.codLab = m.codLab
    join
      tipo_mostra tm
        on  tm.CodTipoMost=m.CodTipoMost
        and tm.codLab = m.codLab
    

    这使我得出结论,括号不是问题。所以,很可能是括号附近的一些其他语法错误。

    根据我在重新格式化您的代码时出现的答案,它似乎是 LENGTH(m.Crotal&lt;5) 应该是 LENGTH(m.Crotal) &lt; 5

    (本质上,&lt; 之前缺少一个),而5 之后还有一个额外的...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2013-08-24
      • 2018-03-27
      • 2023-03-13
      相关资源
      最近更新 更多