如何在变量Oracle Function中使用部分查询

时间:2016-07-14 18:31:55

标签: sql oracle plsql dynamic-sql

我试图将一部分查询用于变量,因为我有很多ifs准备查询,但我没有使用过这样的东西。

FUNCTION f_rel_vendas_importacao(vTP_DADOS in varchar2, nCODIGO in number, dDT_COMPRA_INI in DATE, dDT_COMPRA_FIM in DATE, dDT_EFETIVACAO_INI in DATE, dDT_EFETIVACAO_FIM in DATE) RETURN number is
nRetorno    number(14,2);
vSTRING   VARCHAR2(2000); 

begin

IF vTP_DADOS = 'VL_COMISSAO' THEN
    vSTRING := 'SUM( DECODE( CPF.CD_MOEDA, 1, CPF.VL_COTACAO_UNIT * CPF.QTDE_COMPRA, ( SELECT Imp_Pack.fu_converte_moeda_ORACLE( CPF.CD_MOEDA, 1, CDT.DT_RECEBIMENTO, CPF.VL_COTACAO_UNIT, 1) * CPF.QTDE_COMPRA FROM dual )  ) )';   
END IF;

IF vTP_DADOS = 'QTD_VENDA_SELECTCHEMIE_PERIODO' THEN
   vSTRING := 'count(*)';
END IF;

SELECT 
       vSTRING
INTO
    nRetorno
FROM
    COMPRA_PROD_FORN         CPF,
    COMPRA_DATA              CDT
WHERE
    (CDT.DT_RECEBIMENTO >= dDT_COMPRA_INI AND CDT.DT_RECEBIMENTO <= dDT_COMPRA_FIM) AND
    CDT.CD_COMPRA         = CPF.CD_COMPRA  AND
    CDT.CD_TP_DATA        = 7              AND
    CPF.CD_FORNECEDOR     = nCODIGO;

Return nRetorno;
end
f_rel_vendas_importacao;

1 个答案:

答案 0 :(得分:0)

当您选择vString时,结果是变量vString的内容。它没有尝试将该内容解释为列或表达式。您最好将这些表达式直接放入查询中。

IF vTP_DADOS = 'VL_COMISSAO' THEN
  SELECT 
       SUM( DECODE( CPF.CD_MOEDA, 1, 
          CPF.VL_COTACAO_UNIT * CPF.QTDE_COMPRA, 
            ( SELECT Imp_Pack.fu_converte_moeda_ORACLE( CPF.CD_MOEDA, 1,
                CDT.DT_RECEBIMENTO, CPF.VL_COTACAO_UNIT, 1) *
                                         CPF.QTDE_COMPRA 
              FROM dual )  ) )
  INTO
    nRetorno
  FROM
    COMPRA_PROD_FORN         CPF,
    COMPRA_DATA              CDT
  WHERE
    (CDT.DT_RECEBIMENTO >= dDT_COMPRA_INI AND 
    CDT.DT_RECEBIMENTO <= dDT_COMPRA_FIM) AND
    CDT.CD_COMPRA         = CPF.CD_COMPRA  AND
    CDT.CD_TP_DATA        = 7              AND
    CPF.CD_FORNECEDOR     = nCODIGO;
END IF;

IF vTP_DADOS = 'QTD_VENDA_SELECTCHEMIE_PERIODO' THEN
  SELECT count(*)
  INTO
    nRetorno
  FROM
    COMPRA_PROD_FORN         CPF,
    COMPRA_DATA              CDT
  WHERE
    (CDT.DT_RECEBIMENTO >= dDT_COMPRA_INI AND 
    CDT.DT_RECEBIMENTO <= dDT_COMPRA_FIM) AND
    CDT.CD_COMPRA         = CPF.CD_COMPRA  AND
    CDT.CD_TP_DATA        = 7              AND
    CPF.CD_FORNECEDOR     = nCODIGO;
END IF;