Problema
Não importa o que eu faça, não consigo fazer meu gatilho funcionar. Parece sempre reclamar sobre o comando SQL não terminar corretamente, ignorando a instrução SQL e assim por diante.
Pesquisar
Passei horas investigando por que esse problema está ocorrendo e ainda cheguei de mãos vazias. Esta é a primeira vez que crio um TRIGGER, então tenho a sensação de que tem algo a ver com a colocação das coisas.
O que eu tentei
Eu tentei muitas muitas coisas. Eu tentei adicionar uma vírgula à última variável entre colchetes, tentei adicionar ; para declarações aleatórias e assim por diante. Este é o meu gatilho:
CREATE OR REPLACE TRIGGER create_base_invoice
AFTER INSERT ON reservation
BEGIN
INSERT INTO
invoice
VALUES
(i.resnum, i.bnum, i.rnum, c.cfname, c.clname, i.bstartdate, null, null)
SELECT
i.resnum, i.bnum, i.rnum, c.cfname, c.clname, i.bstartdate
FROM
INSERTED i, CUSTOMER c
WHERE(
(i.cfname = c.cfname)
AND
(i.clname = c.clname)
);
END create_base_invoice;
Não entendo o ponto do comando SELECT no meu caso e tentei removê-lo e não recebo um erro diferente, então não tenho certeza se preciso disso ou não.
A razão pela qual eu adicionei foi devido a tropeçar em um post com um cenário muito semelhante ao meu e ver a resposta conter aquela instrução SELECT que na época eu estava perdendo.
A razão pela qual eu preciso da cláusula where é porque a tabela Reservation não contém o nome e o sobrenome do cliente (que precisamos neste caso). Apenas contém o número do cliente. Segue a tabela de reservas:
RESNUM
CNUM
BNUM
RNUM
BSTARTDATE
BDURATION
BOCCUPANTS
BSTATUS
BPAYMENT
Eu removi a VALUES
cláusula, e agora o erro é
3/78 PL/SQL: ORA-01747: especificação de usuário.tabela.coluna, tabela.coluna ou coluna inválida
Eu removi ,null ,null
também. Ele então reclama
palavra-chave VALUES ausente
Então, o que estou tentando fazer é criar uma fatura com base em uma reserva. Quando alguém reserva uma reserva, o gatilho salva certas variáveis da reserva (resnum, bnum, rnum, bstartdate, cnum) e, em seguida, encontra o nome completo do cliente com base no número do cliente (cnum).
Tudo isso é salvo na fatura para fazer uma fatura base. Então eu tenho outro procedimento que adiciona a data de check-out e calcula o preço total da estadia. Nós não salvamos cnum na fatura.
Apenas para esclarecer, cnum é usado essencialmente para pesquisar o cliente e encontrar seu nome e sobrenome, que é salvo na fatura.
(Editado seguindo os comentários e depois de verificar o que é INSERTED no SQL Server)
A
INSERTED
tabela no SQL Server representa as linhas que foram inseridas pela instrução de acionamento. Oracle não tem isso. Em vez disso, um gatilho em nível de linha pode se referir aos valores de coluna de cada linha afetada pelo gatilho, usando:new
e:old
valores. (Somente:new
os valores são preenchidos para inserções e apenas:old
para exclusões.) Portanto, acho que você precisa é algo assim:Isso cria uma fatura para cada nova reserva, incluindo detalhes pesquisados na tabela do cliente.
Existem dois sabores de
insert
:e
Um é para inserir valores fixos, o outro é para carregar os resultados de uma consulta.