E ai pessoal!
Estou desenvolvendo uma procedure e estou com dificuldade para validar um campo.
É seguinte, preciso verificar se o campo contem um registro, se contem, realiza o update concatenando com o registro de entrada e se não conter registro, apenas faça o update com o registro de entrada.
Obs: Esse campo é separado por virgula.
Segue o meu código:
CREATE OR REPLACE PROCEDURE SP_VINCULO (
P_COD_MATRIZ IN TB_EDIEXT_PERFIL.COD_MATRIZ%TYPE,
P_CONCIL IN TB_EDIEXT_PERFIL.CONCIL%TYPE,
P_ID_MBX IN TB_EDIEXT_PERFIL_MBX.ID_MBX%TYPE,
P_ID_CONCIL INT,
P_DIR_DEST VARCHAR2,
P_PROTOCOLO VARCHAR2
)
IS
V_EC TB_EDIEXT_PERFIL.CONCIL%TYPE;
V_REG_CONCIL NUMBER(1);
V_CONCIL_EC VARCHAR(10);
CONTEM_EC EXCEPTION;
CONTEM_REG EXCEPTION;
CURSOR VERIFICA_EC IS
SELECT P_CONCIL
FROM TB_EDIEXT_PERFIL
WHERE CONCIL = 'EC';
CURSOR VERIFICA_CONCIL IS
SELECT CONCIL
FROM TB_EDIEXT_PERFIL
WHERE CONCIL = 'EC';
BEGIN
INSERT INTO TB_EDIEXT_PERFIL_MBX
VALUES
(PERFIL_MBX.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),
(SELECT ID FROM TB_EDIEXT_MBX WHERE MBX = 'MB'||P_CONCIL));
IF P_PROTOCOLO = 'SFTP' THEN
INSERT INTO TB_EDIEXT_PERFIL_SFTP
VALUES
(PERFIL_SFTP.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),
P_ID_CONCIL,
P_DIR_DEST);
UPDATE TB_EDIEXT_PERFIL
SET SFTP = 1
WHERE COD_MATRIZ = P_COD_MATRIZ;
ELSE
INSERT INTO TB_EDIEXT_PERFIL_CD
VALUES
(PERFIL_CD.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),
P_ID_CONCIL,
P_DIR_DEST,
NULL);
UPDATE TB_EDIEXT_PERFIL
SET CD = 1
WHERE COD_MATRIZ = P_COD_MATRIZ;
END IF;
OPEN VERIFICA_EC;
FETCH VERIFICA_EC INTO V_EC;
IF P_CONCIL = 'EC' THEN
RAISE CONTEM_EC;
END IF;
SELECT CASE WHEN EXISTS (
SELECT CONCIL FROM TB_EDIEXT_PERFIL WHERE CONCIL LIKE P_CONCIL)
THEN 1
ELSE 0
END AS VERIFICA_CONC INTO V_REG_CONCIL
FROM DUAL;
IF V_REG_CONCIL = 1 THEN
RAISE CONTEM_REG;
END IF;
OPEN VERIFICA_CONCIL;
FETCH VERIFICA_CONCIL INTO V_CONCIL_EC;
-- NESTA ETAPA ESTOU VERIFICANDO SE O CAMPO É = 'EC', SE FOR ELE FAZ APENAS O UPDATE SUBSTITUINDO PARA O P_CONCIL DE ENTRADA
IF V_CONCIL_EC = 'EC' THEN
UPDATE TB_EDIEXT_PERFIL
SET CONCIL = P_CONCIL
WHERE COD_MATRIZ = P_COD_MATRIZ;
-- AQUI DEVERIA FAZER O UPDATE CONCATENANDO O P_CONCIL, MAS NÃO ESTÁ FUNCIONANDO.
ELSE
UPDATE TB_EDIEXT_PERFIL
SET CONCIL = (SELECT CONCIL FROM TB_EDIEXT_PERFIL
WHERE COD_MATRIZ = P_COD_MATRIZ)||','||P_CONCIL
WHERE COD_MATRIZ = P_COD_MATRIZ AND ROWNUM = 1;
END IF;
EXCEPTION
WHEN CONTEM_EC
THEN DBMS_OUTPUT.PUT_LINE('NÃO É PERMITIDO VINCULAR '||V_EC);
WHEN CONTEM_REG
THEN DBMS_OUTPUT.PUT_LINE('ERRO! A matriz ja possui vinculo com a conciliadora.');
CLOSE VERIFICA_EC;
CLOSE VERIFICA_CONCIL;
END;
/
O que está ocorrendo é o seguinte, ele está substituindo o campo CONCIL sempre com o parâmetro de entrada P_CONCIL e a concatenação não está funcionando.
Alguém sabe o porque?
Obrigado desde já!