【发布时间】: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