我是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中有没有办法做这种事情?或者我将不得不改变我用来解决这个问题的方式?
答案 0 :(得分:2)
您将多个值提取到单个变量中,该变量是对象类型 - 而不是记录类型。
您的游标查询需要构造一个与变量匹配的对象:
OPEN resulta for
select
F_APOSTA ( -- start of object constructor
pro.CODIGO,
...
0 as sobra_real
) -- end of object constructor
from
...