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

Posted

技术标签:

【中文标题】如何在变量 Oracle 函数中使用部分查询【英文标题】:How to use part of a query inside a variable Oracle Function 【发布时间】:2016-07-14 18:31:55 【问题描述】:

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

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;

【问题讨论】:

当我执行查询时出现错误:EXACT FETCH RETURNS MORE TORE THAN REQUESTED NUMER OF ROWS 但是如果我在这些条件下使用普通选择,它就可以工作 【参考方案1】:

当您选择 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;

【讨论】:

谢谢@gary-myers 但是我有20个或更多不同的选项来准备select,但是FROM之后的结构总是一样的,所以我想知道一种方便维护和由于相等,因此编写的代码也更少。

以上是关于如何在变量 Oracle 函数中使用部分查询的主要内容,如果未能解决你的问题,请参考以下文章

查询oracle数据库时,如何定义变量进行查询

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

oracle 如何把一个变量中的字段拼接起来

如何在 Oracle 中找到哪些查询占用了大部分 CPU 时间?

如何将 db(oracle) 查询的结果存储为全局变量,以便在 talend 的 RUN-IF 条件中使用?

如何在 Oracle PL/SQL 函数中使用变量