Warm tip: This article is reproduced from serverfault.com, please click

sql-使用项目值作为选择代码的一部分

(sql - Using item value as part of the select code)

发布于 2020-12-01 17:37:29

我正在尝试在apex 5.1上正常工作的oracle apex 20上使用一项功能。我有一个交互式报告,并且非常添加这样的项目的价值:'''

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是一个隐藏的页面项目,在页面加载时设置了一个进程,它包含一些代码。在最简单的版本中,它将包含“和1 = 1”,或者可以包含一些附加条件,例如“和o.POSREDNIK ='12345'”,正如我在Apex 5.1中所说的那样。但是在Apex 20中,我什至无法在代码编辑器中验证代码,我得到“ ORA-20999:无法解析SQL查询!

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

“最后没有&FILTER的同一个select很好用。关于如何使它在Apex 20中起作用的任何建议?或者如何在select中插入一些代码?
Questioner
Syd
Viewed
11
Littlefoot 2020-12-02 05:20:02

确实,它不再起作用了。

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

Apex 20的真正不错的功能是,它RETURN使用q引用机制自动将查询转换为子句,以防止可能出现的单引号问题。因此:你只需要更改源类型-Apex将为你完成其余工作,并且报告应能正常工作。至少对我有用。