Oracle - ORA-00907: 缺少右括号

Oracle - ORA-00907: missing right parenthesis

我只是找不到这里有什么问题。正在尝试 select 文章图片的路径。 ORA-00907: 缺少右括号

select artnr, listagg(path, bildnr '.' filtyp) within group (order by bildnr) as sökväg
from kund 
where knr in (select knr
            from kundorder
            where ordnr in (select ordnr
            from orderrad
            where artnr in (select artnr
            from artikel
            where bildnr in (select bildnr
            from artikelbild))))
            order by artnr;

明显错误在 listagg(缺少串联):

No : listagg (path, bildnr '.' filtyp)
Yes: listagg (PATH, bildnr || '.' || filtyp)

其余的应该没问题(就语法而言;无法判断查询是否会(或不会)return您想要的)。


此外,也许您宁愿切换到 JOIN 而不是使用一堆嵌套子查询,例如

  SELECT u.artnr,
         LISTAGG (u.PATH, u.bildnr || '.' || u.filtyp)
            WITHIN GROUP (ORDER BY u.bildnr) AS sokvag
    FROM kund u
         JOIN kundorder o ON u.knr = o.knr
         JOIN orderrad r ON r.ordnr = o.ordnr
         JOIN artikel a ON a.artnr = r.artnr
         JOIN artikelbild b ON b.bildnr = a.bildnr
ORDER BY u.artnr;

ORA-30496 开始:参数应该是一个常量:显然,这是真的。

您想要的代码 运行:

SQL> select listagg(e.ename, e.job ||'.'|| to_char(e.deptno))
  2           within group (order by null) result
  3  from emp e
  4  where rownum <= 3;
select listagg(e.ename, e.job ||'.'|| to_char(e.deptno))
                        *
ERROR at line 1:
ORA-30496: Argument should be a constant.

让我们尝试愚弄 Oracle 并“准备”分隔符:

SQL> with temp as
  2    (select e.ename, e.job ||'.'||to_char(e.deptno) separator
  3     from emp e
  4     where rownum <= 3
  5    )
  6  select listagg(t.ename, t.separator)
  7           within group (order by null)
  8  from temp t;
select listagg(t.ename, t.separator)
                        *
ERROR at line 6:
ORA-30496: Argument should be a constant.

仍然没有运气。但是如果分隔符真的是一个常量(在我的例子中是逗号),那么它 works:

SQL> select listagg(e.ename ||': ' || e.job, ', ')
  2           within group (order by null) result
  3  from emp e
  4  where rownum <= 3;

RESULT
------------------------------------------------------------------------
ALLEN: SALESMAN, SMITH: CLERK, WARD: SALESMAN

SQL>