ошибка - PLS-00679: привязки триггера не разрешены в разделе до / после оператора - PullRequest
0 голосов
/ 29 октября 2019

Я изменяю триггер так, чтобы при изменении столбца tp_status таблицы другой выбор проверял, все ли пункты были выполнены, а затем информировал о завершении в повестке дня. после некоторого исследования получил пропуск 'solicitacaoservicoitem mutant', но я не получаю успешный составной триггер.

это оригинальный код:

create or replace TRIGGER T_FAT_SOLICITACAOSERVICOITEM_A
AFTER UPDATE OF TP_STATUS ON SOLICITACAOSERVICOITEM
FOR EACH ROW
DECLARE
VCD_CONTAPROCEDIMENTO   CONTAPROCEDIMENTO.CD_CONTAPROCEDIMENTO%TYPE;
VCD_OCUPACAO            OCUPACAO.CD_OCUPACAO%TYPE;
VVL_SA                  PROCEDIMENTO.VL_SA%TYPE;
VROWID                  VARCHAR2(30);
VCD_PRESTADOR           SOLICITACAOSERVICO.CD_PRESTADOR%TYPE;
VCD_PACIENTE            SOLICITACAOSERVICO.CD_PACIENTE%TYPE;
BEGIN

SELECT CD_PRESTADOR, CD_PACIENTE
INTO VCD_PRESTADOR, VCD_PACIENTE
FROM SOLICITACAOSERVICO
WHERE ID_SOLICITACAO = :NEW.ID_SOLICITACAO;
VCD_CONTAPROCEDIMENTO := gerasequencia('CONTAPROCEDIMENTO' || LPAD(VCD_PRESTADOR, 3, '0'));

BEGIN

SELECT CD_OCUPACAO
INTO VCD_OCUPACAO
FROM PROCEDIMENTO_OCUPACAO
WHERE CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO
AND CD_OCUPACAO = '223415';
EXCEPTION
WHEN NO_DATA_FOUND THEN

BEGIN
SELECT CD_OCUPACAO
INTO VCD_OCUPACAO
FROM PROCEDIMENTO_OCUPACAO
WHERE CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO
AND CD_OCUPACAO = '225320';

EXCEPTION
WHEN NO_DATA_FOUND THEN

VCD_OCUPACAO := 'XXX';

END;

END;

BEGIN
SELECT VL_SA
INTO VVL_SA
FROM PROCEDIMENTO
WHERE CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
VVL_SA := 0;
END;

INSERT INTO CONTAPROCEDIMENTO
          (CD_UNIDADESAUDE,
           CD_CONTAPROCEDIMENTO,
           CD_PROCEDIMENTO,
           CD_PROFISSIONALSAUDE,
           CD_MODALIDADE,
           CD_OCUPACAO,
           CD_DOENCA,
           DH_EXECUCAO,
           CD_ATENDIMENTO,
           CD_EXECUCAO,
           CD_PACIENTE,
           TP_ORIGEM,
           CD_ORIGEM,
           BO_MANUAL,
           QT_PROCEDIMENTO,
           VL_PROCEDIMENTO,
           TP_STATUS_FAT,
           CD_REGISTRO,
           BO_CANCELADO,
           CD_CENTROCUSTO,
           OBS)

          VALUES
          (VCD_PRESTADOR,
           VCD_CONTAPROCEDIMENTO,
           :NEW.CD_PROCEDIMENTO,
           0,
           1,
           VCD_OCUPACAO,
           NULL,
           :NEW.DH_AGENDA,
           NULL,
           NULL,
           VCD_PACIENTE,
           'EXT',
           :NEW.ID_SOLICITACAOITEM,
           'N',
           1,
           VVL_SA,
           'AG',
           1,
           'N',
           NULL,
           'LANÇAMENTO AUTOMÁTICO - PRESTADOR DE SERVIÇOS' || '[' ||
           TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS') || ']');

-- CONSULTA

BEGIN
SELECT API.ROWID
INTO VROWID
FROM SOLICITACAOSERVICO_CON SSC, AGENDAPROFISSIONALITEM API
WHERE SSC.CD_UNIDADESAUDE = API.CD_UNIDADESAUDE
AND SSC.CD_AGENDA = API.CD_AGENDA
AND SSC.CD_AGENDAMENTO = API.CD_AGENDAMENTO
AND SSC.DH_AGENDAMENTO = API.DH_AGENDAMENTO
AND SSC.ID_SOLICITACAO = :NEW.ID_SOLICITACAO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
VROWID := NULL;
END;

IF VROWID IS NOT NULL THEN
UPDATE AGENDAPROFISSIONALITEM
SET TP_STATUS = 'AT',
OBS = 'ATENDIMENTO AUTOMÁTICO - PRESTADOR DE SERVIÇOS'
WHERE ROWID = VROWID;       
END IF;

-- EXAMES

BEGIN

SELECT SEI.ROWID
INTO VROWID
FROM SOLICITACAOSERVICO_EXA SSE, SOLICITACAOEXAME SE, SOLICITACAOEXAMEITEM SEI, EXAME E
WHERE SSE.CD_UNIDADESAUDE = SE.CD_UNIDADESAUDE
AND SSE.CD_SOLICITACAO = SE.CD_SOLICITACAO
AND SE.CD_UNIDADESAUDE = SEI.CD_UNIDADESAUDE
AND SE.CD_SOLICITACAO = SEI.CD_SOLICITACAO
AND SEI.CD_EXAME = E.CD_EXAME
AND SSE.ID_SOLICITACAO = :NEW.ID_SOLICITACAO
AND E.CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO;

EXCEPTION
WHEN OTHERS THEN
VROWID := NULL;

END;


IF VROWID IS NOT NULL THEN
UPDATE SOLICITACAOEXAMEITEM
SET TP_STATUS = 'CON'
WHERE ROWID = VROWID;

END IF;

END;

После изменения tp_status мне нужно проверить данныеснова в таблице, затем сообщите в повестку дня. Я пытаюсь изменить:

create or replace TRIGGER T_FAT_SOLICITACAOSERVICOITEM_A
FOR UPDATE OF TP_STATUS ON SOLICITACAOSERVICOITEM
COMPOUND TRIGGER

VCD_CONTAPROCEDIMENTO   CONTAPROCEDIMENTO.CD_CONTAPROCEDIMENTO%TYPE;
VCD_OCUPACAO            OCUPACAO.CD_OCUPACAO%TYPE;
VVL_SA                  PROCEDIMENTO.VL_SA%TYPE;
VROWID                  VARCHAR2(30);
SROWID                  VARCHAR2(30);
VCD_PRESTADOR           SOLICITACAOSERVICO.CD_PRESTADOR%TYPE;
VCD_PACIENTE            SOLICITACAOSERVICO.CD_PACIENTE%TYPE;


AFTER EACH ROW IS

BEGIN
SELECT CD_PRESTADOR, CD_PACIENTE
INTO VCD_PRESTADOR, VCD_PACIENTE
FROM SOLICITACAOSERVICO
WHERE ID_SOLICITACAO = :NEW.ID_SOLICITACAO;

VCD_CONTAPROCEDIMENTO := gerasequencia('CONTAPROCEDIMENTO' || LPAD(VCD_PRESTADOR, 3, '0'));

BEGIN
SELECT CD_OCUPACAO
INTO VCD_OCUPACAO
FROM PROCEDIMENTO_OCUPACAO
WHERE CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO
AND CD_OCUPACAO = '223415';

EXCEPTION
WHEN NO_DATA_FOUND THEN

BEGIN
SELECT CD_OCUPACAO
INTO VCD_OCUPACAO
FROM PROCEDIMENTO_OCUPACAO
WHERE CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO
AND CD_OCUPACAO = '225320';

EXCEPTION
WHEN NO_DATA_FOUND THEN

VCD_OCUPACAO := 'XXX';

END;

END;

BEGIN
SELECT VL_SA
INTO VVL_SA
FROM PROCEDIMENTO
WHERE CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
VVL_SA := 0;
END;

INSERT INTO CONTAPROCEDIMENTO
          (CD_UNIDADESAUDE,
           CD_CONTAPROCEDIMENTO,
           CD_PROCEDIMENTO,
           CD_PROFISSIONALSAUDE,
           CD_MODALIDADE,
           CD_OCUPACAO,
           CD_DOENCA,
           DH_EXECUCAO,
           CD_ATENDIMENTO,
           CD_EXECUCAO,
           CD_PACIENTE,
           TP_ORIGEM,
           CD_ORIGEM,
           BO_MANUAL,
           QT_PROCEDIMENTO,
           VL_PROCEDIMENTO,
           TP_STATUS_FAT,
           CD_REGISTRO,
           BO_CANCELADO,
           CD_CENTROCUSTO,
           OBS)

          VALUES
          (VCD_PRESTADOR,
           VCD_CONTAPROCEDIMENTO,
           :NEW.CD_PROCEDIMENTO,
           0,
           1,
           VCD_OCUPACAO,
           NULL,
           :NEW.DH_AGENDA,
           NULL,
           NULL,
           VCD_PACIENTE,
           'EXT',
           :NEW.ID_SOLICITACAOITEM,
           'N',
           1,
           VVL_SA,
           'AG',
           1,
           'N',
           NULL,
           'LANÇAMENTO AUTOMÁTICO - PRESTADOR DE SERVIÇOS' || '[' ||
           TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS') || ']');


-- EXAMES

BEGIN
SELECT SEI.ROWID
INTO VROWID
FROM SOLICITACAOSERVICO_EXA SSE, SOLICITACAOEXAME SE, SOLICITACAOEXAMEITEM SEI, EXAME E
WHERE SSE.CD_UNIDADESAUDE = SE.CD_UNIDADESAUDE
AND SSE.CD_SOLICITACAO = SE.CD_SOLICITACAO
AND SE.CD_UNIDADESAUDE = SEI.CD_UNIDADESAUDE
AND SE.CD_SOLICITACAO = SEI.CD_SOLICITACAO
AND SEI.CD_EXAME = E.CD_EXAME
AND SSE.ID_SOLICITACAO = :NEW.ID_SOLICITACAO
AND E.CD_PROCEDIMENTO = :NEW.CD_PROCEDIMENTO;
EXCEPTION
WHEN OTHERS THEN
VROWID := NULL;
END;


IF VROWID IS NOT NULL THEN
UPDATE SOLICITACAOEXAMEITEM
SET TP_STATUS = 'CON'
WHERE ROWID = VROWID;

END IF;

END AFTER EACH ROW;


AFTER STATEMENT IS
BEGIN

SELECT ROWID
INTO SROWID
FROM SOLICITACAOSERVICOITEM
WHERE TP_STATUS = 'S'
AND ID_SOLICITACAO = :NEW.ID_SOLICITACAO;    
EXCEPTION
WHEN NO_DATA_FOUND THEN
SROWID := NULL; -- ENQUANTO HOUVER ITEM SOLICITADO A AGENDA NAO PODE ESTAR ATENDIDO

BEGIN
SELECT API.ROWID
INTO VROWID
FROM SOLICITACAOSERVICO_CON SSC, AGENDAPROFISSIONALITEM API
WHERE SSC.CD_UNIDADESAUDE = API.CD_UNIDADESAUDE
AND SSC.CD_AGENDA = API.CD_AGENDA
AND SSC.CD_AGENDAMENTO = API.CD_AGENDAMENTO
AND SSC.DH_AGENDAMENTO = API.DH_AGENDAMENTO
AND SSC.ID_SOLICITACAO = :NEW.ID_SOLICITACAO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
VROWID := NULL;
END;


IF VROWID IS NOT NULL THEN
IF SROWID IS NULL THEN
UPDATE AGENDAPROFISSIONALITEM
SET TP_STATUS = 'AT',
OBS = 'ATENDIMENTO AUTOMÁTICO - PRESTADOR DE SERVIÇOS'
WHERE ROWID = VROWID;
END IF;        
END IF;

END AFTER STATEMENT;

END;

здесь показаны привязки триггера, не разрешенные в разделе до / после оператора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...