Я изменяю триггер так, чтобы при изменении столбца 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;
здесь показаны привязки триггера, не разрешенные в разделе до / после оператора