【问题标题】:SQL query works in DBeaver but not in Oracle ApexSQL 查询在 DBeaver 中有效,但在 Oracle Apex 中无效
【发布时间】:2020-11-20 18:32:51
【问题描述】:

我构建了一个查询,通过一些 dblink 从表中获取数据。

这是查询:

SELECT * 
FROM 
    (
SELECT 
    MOVS.POLIZA,
    MOVS.CONTRATANTE,
    MOVS.SERIE,
    MOVS.FECHA,
    MOVS.ENDOSO,
    SUM(MOVS.PORCENTAJE) AS PORCENTAJE,
    SUM(MOVS.PRIMA) AS PRIMA,
    SUM(MOVS.COMISION) AS COMISION,
    SUM(MOVS.IVA) AS IVA,
    SUM(MOVS.ISR) AS ISR,
    SUM(MOVS.IVA_RET) AS IVA_RET,
    SUM(MOVS.RTP) AS RTP,
    SUM(MOVS.MONTO_NETO) AS MONTO_NETO
FROM (
        SELECT 
            NVL(MMN.EMISOR, SUBSTR(MOV.REFERENCIA,0, 4)) || ' ' || LTRIM(MOV.NUMPOL, '0') AS POLIZA, 
            PR.NOMBRE_CLIENTE@ACSELXDBLINK(POLIZA.CODCLI) AS CONTRATANTE,
            MOV.NUM_SERIE AS SERIE,
            MOV.FEC_CONTA AS FECHA,
            MOV.NUM_ENDOSO AS ENDOSO,
            DETMOV.PORC_COM AS PORCENTAJE,
            DETMOV.PMA_COBRO AS PRIMA,
            DETMOV.TOT_COM_L AS COMISION,
            DETMOV.IVA_AG_L AS IVA,
            DETMOV.ISR_AG_L AS ISR,
            DETMOV.RET_IVA_AG_L AS IVA_RET,
            DETMOV.IMP_CED_L AS RTP,
            DETMOV.MTO_NETO_L AS MONTO_NETO,
            AG.COD_INTER AS COD_INTER
        FROM 
            MOV_AGENTE@ADCOMDBLINK MOV
            LEFT JOIN MOV_MANUAL@ADCOMDBLINK MMN
                ON MOV.ID_MOV_MANUAL = MMN.ID_MOV_MANUAL,
            DET_MOV_AGENTE@ADCOMDBLINK DETMOV,
            AGENTE@ADCOMDBLINK AG,
            TIPO_MOV_AGENTE@ADCOMDBLINK TIPOMOV,
            POLIZA@ACSELXDBLINK POLIZA
        WHERE 
            :P3_CLICK_BUSCAR = 1 AND
            DETMOV.ID_MOV_AGTE = MOV.ID_MOV_AGTE AND 
            MOV.ID_AGENTE= AG.ID_AGENTE AND 
            MOV.COD_TIPO_MOV= TIPOMOV.COD_TIPO_MOV AND 
            TIPOMOV.COD_TIPO_MOV != '0308' AND 
            POLIZA.STSPOL = 'ACT' AND
            POLIZA.CODPROD = NVL(MMN.EMISOR, SUBSTR(MOV.REFERENCIA,0, 4)) AND 
            POLIZA.NUMPOL = LTRIM(LTRIM(MOV.NUMPOL, ' '), '0') AND 
            POLIZA.NUMREN = (SELECT MAX(PO.NUMREN)
                            FROM POLIZA@ACSELXDBLINK PO
                            WHERE PO.CODPROD = NVL(MMN.EMISOR, SUBSTR(MOV.REFERENCIA,0, 4))
                            AND PO.NUMPOL = MOV.NUMPOL) AND 
            (
                (:P3_TIPO_USUARIO = 'A' AND 
                    AG.COD_INTER = TO_NUMBER(:P3_CLAVE_AGENTE)
                ) OR 
                /*
                 * This breaks the query in Apex 
                 (:P3_TIPO_USUARIO = 'C' AND 
                    (AG.COD_INTER IN (
                        SELECT 
                            INTER.CODINTER
                        FROM
                            INTERMEDIARIO@ACSELXDBLINK INTER,
                            CELULA_EJECUTIVO@ACSELXDBLINK CELEJEC
                        WHERE 
                            (:P3_AGENTE_SEL IS NULL OR INTER.CODINTER = TO_NUMBER(:P3_AGENTE_SEL)) AND 
                            INTER.CODEJECUTIVOCUENTA = CELEJEC.CODEJECUTIVO AND
                            INSTR(:P3_CELULAS, CELEJEC.CODCELULA) > 0
                    ))
                ) OR */
                (:P3_TIPO_USUARIO = 'G' AND 
                    (:P3_AGENTE_SEL IS NULL OR AG.COD_INTER = TO_NUMBER(:P3_AGENTE_SEL))
                )
            ) AND 
            CASE 
                WHEN :P3_FECHAINICIO IS NOT NULL AND :P3_FECHAFIN IS NOT NULL THEN 
                    CASE WHEN MOV.FEC_CONTA BETWEEN TO_DATE(:P3_FECHAINICIO, 'DD/MM/YYYY') AND TO_DATE(:P3_FECHAFIN, 'DD/MM/YYYY') THEN 1 ELSE 0 END
                WHEN :P3_FECHAINICIO IS NOT NULL AND :P3_FECHAFIN IS NULL THEN
                    CASE WHEN MOV.FEC_CONTA >= TO_DATE(:P3_FECHAINICIO, 'DD/MM/YYYY') THEN 1 ELSE 0 END
                WHEN :P3_FECHAINICIO IS NULL AND :P3_FECHAFIN IS NOT NULL THEN
                    CASE WHEN MOV.FEC_CONTA <= TO_DATE(:P3_FECHAFIN, 'DD/MM/YYYY') THEN 1 ELSE 0 END
            ELSE
                CASE WHEN MOV.FEC_CONTA BETWEEN TRUNC(SYSDATE, 'MONTH') AND ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), 1) - INTERVAL '1' SECOND THEN 1 ELSE 0 END
            END = 1 AND
            CASE 
                WHEN :P3_POLIZA IS NOT NULL THEN 
                    CASE WHEN TO_NUMBER(MOV.NUMPOL) = TO_NUMBER(:P3_POLIZA) THEN 1 ELSE 0 END
                ELSE
                    1
            END = 1 
    ) MOVS
GROUP BY MOVS.POLIZA, MOVS.CONTRATANTE, MOVS.SERIE, MOVS.FECHA, MOVS.ENDOSO
)        
WHERE MONTO_NETO != 0 

我在 DBeaver 中构建查询并从那里测试它们。

我已经在 where 子句中注释了部分查询,以使其在 Oracle Apex 中的 SQL 命令上运行,但在某些情况下,我确实需要验证这些条件。

如果我在 Oracle Apex 中在未注释这些条件的情况下在 SQL 命令上运行查询,则它不起作用,我没有得到任何数据,应用程序就会卡住。

但是,如果我在 DBeaver 未注释的条件下运行查询,我会在不到 1 秒的时间内获得预期的数据。

在这两种情况下,所有参数都相同,我使用 P3_TIPO_USUARIO 作为“G”。

我不知道为什么会这样,可能是 Oracle Apex 中的子查询有问题,我不知道。

希望你能帮助我。

【问题讨论】:

    标签: sql subquery oracle-apex sqlperformance dbeaver


    【解决方案1】:

    在属性中,就在您输入 where 子句的下方,有一个名为“要提交的页面项目”的属性您是否有您的页面项目,即 P3_TIPO_USUARIO、P3_AGENETE_SEL 和其他列出的?字段末尾有一个图标,您可以使用该图标来选择列表的名称,这样您就可以确保它们拼写正确,并且它们在列表和 where 子句中应该是大写字母。如果它们不在要提交的页面项目列表中,您的查询将不会返回结果。

    【讨论】:

    • 我正在 SQL Workshop / SQL 命令中运行查询。我还在“页面项目”属性中列出了所有必需的字段。
    猜你喜欢
    • 2019-12-06
    • 2013-06-03
    • 2013-01-24
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多