Oracle - 操作select中的数据并返回整个结果的函数

时间:2018-06-01 20:08:25

标签: oracle function migration

我是oracle的新手,我试图重新编写一些关于firebird的程序。

我过去做的大部分过程都是为了操作select和return中的数据,但是我在oracle上无法做同样的事情。

以下是我要做的一个例子:

我创建了一个类型:

TYPE F_APOSTA is OBJECT (
   codigo       varchar2(15),
   descricao    varchar2(100),
   grupo        varchar2(50),
   cor          varchar2(6),
   desc_cor     varchar2(80),
   tamanho      varchar2(4),
   estoque      number,
   expedido     number, 
   vendido      number,
   em_producao  number,
   perdido      number,
   qualidade_2  number,
   num_ofs      number,
   ordem        integer,
   faturado     number,
   sai_estoque  number,
   incompleto   number,
   saldo_tmp    number, 
   producao_tmp number,
   a_produzir   number,
   sobra        number,
   aposta       number,
   sobra_real   number
);

然后我尝试在函数中执行与firebird相同的操作:

FUNCTION F_APOSTA_PCP
(
colecao in varchar2,
indice in number,
referencia in varchar2,
periodo in varchar2,
bloqueio in varchar2
) RETURN F_APOSTA

IS
resulta SYS_REFCURSOR;  
l_result_rec F_aposta;

begin
OPEN resulta for  
 select 
        pro.CODIGO,
        pro.DESCRICAO,
        gru.DESCRICAO as grupo,
        pai.COR, 
        cor.DESCRICAO as desc_cor,
        fai.TAMANHO, 
        cast(coalesce((select sum(est.QUANTIDADE) from PA_ITEN_001 est where est.CODIGO = pro.CODIGO and fai.TAMANHO = est.TAM and pai.COR = est.COR and est.TIPO = pai.TIPO and est.DEPOSITO = pai.DEPOSITO and est.QUANTIDADE > 0), 0) as number) as estoque,
        cast(coalesce((select sum(expe.QTDE) from PEDIDO3_001 expe where expe.CODIGO = pro.CODIGO and fai.TAMANHO = expe.TAM and pai.COR = expe.COR and expe.DEPOSITO = pai.DEPOSITO and expe.QTDE > 0), 0) as number) as EXPEDIDO,
        cast(coalesce((select sum(ped.QTDE + ped.QTDE_F) from PED_ITEN_001 ped, PEDIDO_001 p where p.NUMERO = ped.NUMERO and pro.CODIGO = ped.CODIGO and fai.TAMANHO = ped.TAM and pai.COR = ped.COR and p.COLECAO = COLECAO and ped.QTDE + ped.QTDE_F > 0 and p.FINANCEIRO like '%'||BLOQUEIO||'%'), 0) as number) as vendido,
        cast(coalesce((select sum(ofi.QTDE) from OF1_001 ofa, OF_ITEN_001 ofi where ofa.CODIGO = pro.CODIGO and ofa.NUMERO = ofi.NUMERO and ofi.TAM = fai.TAMANHO and ofi.COR = pai.COR and ofi.QTDE > 0 and ofa.PERIODO like '%'||PERIODO||'%' and ofi.QTDE > 0), 0) as number) as em_producao,
        cast(coalesce((select sum(fac.QUANT_F) from FACCAO_001 fac, OF1_001 ofa where ofa.NUMERO = fac.NUMERO and fac.CODIGO = pro.CODIGO and fac.TAM = fai.TAMANHO and fac.COR = pai.COR and ofa.PERIODO like '%'||PERIODO||'%'), 0) as number) as perdido,
        cast(coalesce((select sum(fac.QUANT_2) from FACCAO_001 fac, OF1_001 ofa where ofa.NUMERO = fac.NUMERO and fac.CODIGO = pro.CODIGO and fac.TAM = fai.TAMANHO and fac.COR = pai.COR and ofa.PERIODO like '%'||PERIODO||'%'), 0) as number) as qualidade_2,
        cast(coalesce((select count(ofa.NUMERO) from OF1_001 ofa where ofa.CODIGO = pro.CODIGO and ofa.PERIODO like '%'||PERIODO||'%'), 0) as number) as num_ofs,
        fai.POSICAO as ordem,
        cast(coalesce((select sum(ped.QTDE_F) from PED_ITEN_001 ped, PEDIDO_001 p where p.NUMERO = ped.NUMERO and pro.CODIGO = ped.CODIGO and fai.TAMANHO = ped.TAM and pai.COR = ped.COR and p.COLECAO = COLECAO), 0) as number) as faturado,
        cast(coalesce((select sum(mov.QTDE) from PA_MOV_001 mov where mov.CODIGO = pro.CODIGO and fai.TAMANHO = mov.TAMANHO and pai.COR = mov.COR and mov.OPERACAO = 'S' and mov.TIP_BAI = '5' and mov.TIPO = pai.TIPO and mov.DEPOSITO = pai.DEPOSITO), 0) as number) as sai_estoque,
        cast(coalesce((select sum(fac.QUANT_I) from FACCAO_001 fac, OF1_001 ofa where ofa.NUMERO = fac.NUMERO and fac.CODIGO = pro.CODIGO and fac.TAM = fai.TAMANHO and fac.COR = pai.COR and ofa.PERIODO like '%'||PERIODO||'%'), 0) as number) as incompleto,
        0 as saldo_tmp,
        0 as producao_tmp,
        0 as a_produzir,
        0 as sobra,
        0 as aposta,
        0 as sobra_real    
 from
        PRODUTO_001 pro
        left outer join GRUPO_PA_001 gru on (gru.CODIGO = pro.GRUPO),
        FAIXA_ITEN_001 fai,
        PA_ITEN_001 pai
        left outer join CADCOR_001 cor ON (pai.COR = cor.COR)
 where
        pro.CODIGO is not null
        and pro.FAIXA = fai.FAIXA
        and pro.CODIGO = pai.CODIGO
        and fai.TAMANHO = pai.TAM
        and pro.COLECAO = COLECAO
        and pai.TIPO = '1'
        and pai.DEPOSITO in ('0000')
        and pai.LOTE = '000000'
        and pro.CODIGO like '%'||REFERENCIA||'%'

 order by
        pro.CODIGO,
        pai.COR,
        fai.POSICAO;  
 loop  fetch resulta into l_result_rec;
       exit when resulta%notfound;            
       l_result_rec.SALDO_TMP := (l_result_rec.ESTOQUE + l_result_rec.EXPEDIDO + l_result_rec.EM_PRODUCAO) - (l_result_rec.VENDIDO - l_result_rec.FATURADO);
       if (l_result_rec.SALDO_TMP > 0)
       then
          l_result_rec.A_PRODUZIR := 0;
       else
          l_result_rec.A_PRODUZIR := l_result_rec.SALDO_TMP * -1; 
       end if;  

       if (l_result_rec.SALDO_TMP > 0)
       then
          l_result_rec.SOBRA := l_result_rec.SALDO_TMP;
       else
          l_result_rec.SOBRA := 0;
          l_result_rec.APOSTA := (INDICE * l_result_rec.VENDIDO) - (l_result_rec.ESTOQUE + l_result_rec.EXPEDIDO) - l_result_rec.EM_PRODUCAO - l_result_rec.FATURADO;  
       end if;
       if (l_result_rec.APOSTA < 0)
       then 
          l_result_rec.APOSTA := 0;
          l_result_rec.SOBRA_REAL := (INDICE * l_result_rec.VENDIDO) - (l_result_rec.ESTOQUE + l_result_rec.EXPEDIDO) - l_result_rec.EM_PRODUCAO - l_result_rec.FATURADO;
       end if;
       if (l_result_rec.SOBRA_REAL > 0)
       then 
          l_result_rec.SOBRA_REAL := 0;
       end if; 

 end loop; 
 close resulta;       
 return (l_result_rec);



 end F_APOSTA_PCP;

看起来是相同的逻辑,但我在获取的行上不断收到执行错误。在Oracle中有没有办法做这种事情?或者我将不得不改变我用来解决这个问题的方式?

1 个答案:

答案 0 :(得分:2)

您将多个值提取到单个变量中,该变量是对象类型 - 而不是记录类型。

您的游标查询需要构造一个与变量匹配的对象:

OPEN resulta for  
 select
  F_APOSTA (            -- start of object constructor
        pro.CODIGO,
        ...
        0 as sobra_real 
  )                     -- end of object constructor
 from
 ...