使用项目值作为 select 代码的一部分

Using item value as part of the select code

我正在尝试使用 oracle apex 20 上的一项功能,该功能在 apex 5.1 中运行良好。 我有一个交互式报告,并且在我添加项目的价值时是这样的: '''

SELECT                                                        /* PARALLEL(4)*/
       o.id,
       NULL
           pregled,
       o.OS_TIP,
       o.SIFRA,
       o.OS_TIP_PRETH,
       o.PRETHODI,
       o.OS_TIP_MASTER,
       o.MASTER,
       u.naziv || ' - ' || o.UGOVARATELJ
           Ugovaratelj,
       p.naziv || ' - ' || o.POSREDNIK
           Posrednik,
       t.naziv || ' ' || o.TRAJANJE
           Trajanje,
       o.POCETAK_OSIGURANJA,
       o.ISTEK_OSIGURANJA,
       o.POCETAK_PREMIJE,
       o.KRAJ_PREMIJE,
       o.DATUM_IZDANJA,
       o.BROJ_RATA,
       o.PREMIJA,
       (  SELECT CASE
                     WHEN MONTHS_BETWEEN (
                              TO_DATE (osd.kraj_premije, 'DD.MM.YYYY'),
                              TO_DATE (osd.pocetak_premije, 'DD.MM.YYYY')) <
                          12
                     THEN
                         ROUND (SUM (st.premija_neto), 2)
                     ELSE
                         ROUND (
                               SUM (st.premija_neto)
                             / NVL (
                                   (  (FLOOR (
                                           MONTHS_BETWEEN (
                                               TO_DATE (osd.kraj_premije,
                                                        'DD.MM.YYYY'),
                                               TO_DATE (osd.pocetak_premije,
                                                        'DD.MM.YYYY'))))
                                    / 12),
                                   1),
                             2)
                 END    godisnja
            FROM os_dokument osd, stavka_dokumenta st
           WHERE     st.os_tip(+) = osd.os_tip
                 AND st.sifra(+) = osd.sifra
                 AND osd.os_tip(+) = o.os_tip
                 AND osd.sifra(+) = o.sifra
        GROUP BY osd.pocetak_premije, osd.kraj_premije)
           godisnja_premija,
       r.naziv || ' - ' || o.REFERENT
           Referent,
       prodaja.F_STATUS_POLICE (O.OS_TIP, O.SIFRA)
           STATUS_POLISE,
       (SELECT forma
          FROM odobrenje
         WHERE odobrenje = o.odobrenje)
           status_odobravanja,
       sd.grupacija || sd.grupa || '.' || sd.cjenik
           tarifa,
       dms.postoji_dokument (o.id)
           postoji_dokumentacija,
       (SELECT k.tekst
          FROM os_dokument_komentar k
         WHERE k.OS_DOKUMENT_ID = o.id AND k.indikator = 1)
           poruka,
       o.korisnik,
       DECODE ((SELECT k.tekst
                  FROM os_dokument_komentar k
                 WHERE k.OS_DOKUMENT_ID = o.id AND k.indikator = 1),
               NULL, 'background-color:white',
               'background-color:lightblue')
           CSS_STYLE_PORUKA,
       DECODE (dms.postoji_dokument (o.id),
               'NE', 'background-color:white"',
               'background-color:lightblue')
           CSS_STYLE_DMS
  FROM OS_DOKUMENT       o,
       in2_stranka       p,
       in2_stranka       r,
       in2_stranka       u,
       in2_stranka       pl,
       trajanje          t,
       stavka_dokumenta  sd
 WHERE     o.posrednik = p.jmbg(+)
       AND o.referent = r.jmbg(+)
       AND o.ugovaratelj = u.jmbg(+)
       AND o.trajanje = t.trajanje(+)
       AND (o.os_tip = 'P08' OR o.os_tip LIKE 'N1%')
       AND o.id = sd.id_os_dokument(+)
       AND sd.rb(+) = 1
       AND o.platitelj = pl.jmbg(+)
       &FILTER.

''' FILTER 是一个隐藏的页面项,它在页面加载时设置了一个过程,它包含一些代码。在最简单的版本中,它将包含“and 1=1”,或者它可以包含一些附加条件,如“and o.POSREDNIK = '12345'” 正如我在 Apex 5.1 中所说,这工作得很好。但是在 Apex 20 中,我什至无法在代码编辑器中验证代码,我明白了 “ ORA-20999: 解析 SQL 查询失败!

ORA-06550:第 53 行,第 27 列:ORA-00933:SQL 命令未正确结束

” 没有 &FILTER 的相同 select。最后工作得很好。 任何建议如何让它在 Apex 20 中工作?或者如何将一些代码插入 select ?

没错,它不再起作用了。

但是,如果您选择返回SQL查询的函数体作为源类型(而不是SQL查询),它将起作用。

Apex 20 真正好的功能是它会自动将您的查询转换为 RETURN 子句,使用 q-quoting 机制来防止可能的 单引号 问题。所以:您只需更改来源类型 - Apex 将为您完成剩下的工作,报告应该可以正常工作。至少,它对我有用。