Gostaria de poder fazer um SELECT dentro do LOOP igual ao exemplo abaixo.
Esse exemplo não deu certo, se tirar esse SELECT que está dentro do LOOP, tudo funciona. O problema está no Select dentro do LOOP que nao aceita.
ORA-01403: dados não encontrados
A ideia é, Z45 grava cliente, e Z46 grava títulos em aberto.
Toda vez que rodar, deverá checar se existe novos títulos que ainda não foram gravados, e só gravar os que ainda não foram.
Alguem sabe alguma maneira de fazer o que preciso ?
DECLARE
v_CODCLI VARCHAR2 (6);
vPREFIXO VARCHAR2 (3);
vNUM VARCHAR2 (9);
vPARCELA VARCHAR2 (3);
BEGIN
v_CODCLI := '0';
FOR V_FUNC IN
(
SELECT E1_FILIAL, A1_COD, A1_LOJA, A1_PESSOA, E1_PREFIXO, E1_NUM, E1_PARCELA, E1_TIPO, E1_NATUREZ, E1_EMISSAO, E1_VENCREA, E1_VALOR,
CASE WHEN TO_DATE('20190627', 'yyyymmdd') - TO_DATE(E1_VENCTO, 'yyyymmdd') < 0
THEN 0
ELSE TO_DATE('20190627', 'yyyymmdd') - TO_DATE(E1_VENCTO, 'yyyymmdd') END ATRASO
FROM SE1010 SE1
INNER JOIN SA1010 A1 ON A1.A1_COD = E1_CLIENTE AND A1_LOJA = E1_LOJA AND A1.D_E_L_E_T_ = SE1.D_E_L_E_T_
WHERE SE1.D_E_L_E_T_ = ' '
ORDER BY A1_LOJA, A1_COD
)
LOOP
SELECT Z46_PREFIX, Z46_NUM, Z46_PARCEL, Z46_TIPO, Z46_NATURE
INTO vPREFIXO, vNUM, vPARCELA, vTIPO, vNATUREZ
FROM Z46010 Z46
WHERE Z46_PREFIX = V_FUNC.E1_PREFIXO
AND Z46_NUM = V_FUNC.E1_NUM
AND Z46_PARCEL = V_FUNC.E1_PARCELA
AND D_E_L_E_T_ = ' ' ;
IF vPREFIXO || vNUM || vPARCELA != V_FUNC.E1_PREFIXO || V_FUNC.E1_NUM || V_FUNC.E1_PARCELA THEN
IF V_FUNC.A1_COD <> v_CODCLI THEN
v_CODCLI := V_FUNC.A1_COD;
INSERT
INTO DADOSADV.Z45010
(
Z45_RECNO,
Z45_FILIAL,
Z45_CODCLI,
Z45_LOJA,
Z45_PESSOA,
Z45_DTCAD
)
VALUES
(
(SELECT CASE WHEN MAX(Z45_RECNO) IS NULL THEN 1 ELSE MAX(Z45_RECNO) + 1 END Z45_RECNO FROM Z45010) ,
V_FUNC.E1_FILIAL,
V_FUNC.A1_COD,
V_FUNC.A1_LOJA,
V_FUNC.A1_PESSOA,
TO_CHAR(SYSDATE, 'YYYYMMDD')
);
COMMIT;
END IF;
INSERT
INTO DADOSADV.Z46010
(
Z46_RECNO,
Z46_RECZ45,
Z46_STATIT,
Z46_PREFIX,
Z46_NUM,
Z46_PARCEL,
Z46_TIPO,
Z46_NATURE,
Z46_VALOR,
Z46_ATRASO,
Z46_DTCAD
)
VALUES
(
(SELECT CASE WHEN MAX(Z46_RECNO) IS NULL THEN 1 ELSE MAX(Z46_RECNO) + 1 END Z46_RECNO FROM Z46010) ,
(SELECT CASE WHEN MAX(Z45_RECNO) IS NULL THEN 1 ELSE MAX(Z45_RECNO) END Z45_RECNO FROM Z45010),
0,
V_FUNC.E1_PREFIXO,
V_FUNC.E1_NUM,
V_FUNC.E1_PARCELA,
V_FUNC.E1_TIPO,
V_FUNC.E1_NATUREZ,
20,
V_FUNC.ATRASO,
TO_CHAR(SYSDATE, 'YYYYMMDD')
);
COMMIT;
END IF;
END LOOP;
END;