所以我最近在sql中进行了大量的编程,但我仍然是一个新手,并且不了解该语言的许多规则以及何时编译器没有帮助我真的不知道该怎么做。
在这种情况下,我遇到了三个错误:
Error(5,12): PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: (...)
Error(5,125): PLS-00103: Encountered the symbol ")" when expecting one of the following: * (...)
Error(22,20): PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: end not pragma final instantiable order overriding static member constructor map
这里是代码,如果CONTRATO.DATA_CONTRATO上的日期差异和今天的DATE(更具体地说是月差异)小于8并且他们有任何日期差异,则插入到MENSALIDADE表中的触发器在FATURA注册,其中ESTADO是'Nao pago' (对不起葡萄牙语,但它没有支付'):
create or replace TRIGGER ANULAR_CONTRATO BEFORE DELETE ON CONTRATO
FOR EACH ROW
DECLARE
valor NUMBER;
juro NUMBER;
BEGIN
juro := (SELECT COUNT(N_FATURA) FROM FATURA WHERE (EXTRACT(month FROM FATURA.DATA_FATURA) = (EXTRACT(month FROM SYSDATE))));
valor := (50 + juro);
IF DELETING THEN
IF ((MONTHS_BETWEEN(:OLD.DATA_CONTRATO, SYSDATE)) <= 8) THEN
IF EXISTS (SELECT (FATURA.CODIGO_CLIENTE) FROM FATURA, CONTRATO WHERE (FATURA.CODIGO_CLIENTE = CONTRATO.CODIGO_CLIENTE)) THEN
IF EXISTS (SELECT (FATURA.CODIGO_CLIENTE) FROM FATURA, CONTRATO WHERE ((FATURA.CODIGO_CLIENTE = CONTRATO.CODIGO_CLIENTE) AND (FATURA_ESTADO = 'Nao Pago'))) THEN
INSERT INTO MENSALIDADE (N_MENSALIDADE, CODIGO_CLIENTE, N_CONTRATO, VALOR, DATA_FIM) VALUES (SEQ_MENSALIDADE.NEXTVAL, CONTRATO.CODIGO_CLIENTE, CONTRATO.N_CONTRATO, valor ,CONTRATO.DATA_FIM_CONTRATO);
END IF;
END IF;
ELSE
IF EXISTS (SELECT (FATURA.CODIGO_CLIENTE) FROM FATURA, CONTRATO WHERE (FATURA.CODIGO_CLIENTE = CONTRATO.CODIGO_CLIENTE)) THEN
IF EXISTS (SELECT (FATURA.ESTADO) FROM FATURA, CONTRATO WHERE (FATURA.CODIGO_CLIENTE = CONTRATO.CODIGO_CLIENTE) AND (FATURA_ESTADO = 'Nao Pago')) THEN
INSERT INTO MENSALIDADE (N_MENSALIDADE, CODIGO_CLIENTE, N_CONTRATO, VALOR, DATA_FIM) VALUES (SEQ_MENSALIDADE.NEXTVAL, CONTRATO.CODIGO_CLIENTE, CONTRATO.N_CONTRATO, valor ,CONTRATO.DATA_FIM_CONTRATO);
END IF;
END IF;
END IF;
END IF;
END ANULAR_CONTRATO;
第一个错误可能是我无法完成我正在做的事情,但是如果能够正确地做到这一点的一些帮助将非常感激。 第三个我不知道为什么会发生。谢谢!
答案 0 :(得分:2)
这会有所帮助:
SELECT COUNT(N_FATURA) into juro
FROM FATURA
WHERE (EXTRACT(month FROM FATURA.DATA_FATURA) = (EXTRACT(month FROM SYSDATE)));
&#13;
答案 1 :(得分:1)
您需要使用SELECT INTO
中的PL/SQL
来设置从SELECT
查询返回的值。您能否按照以下方式更改它,看看之后会出现什么错误?
IF EXISTS
在Oracle中无效,请参阅here。
我想,您无法使用CONTRATO.DATA_FIM_CONTRATO
获取已删除行的值,而是需要编写:old.DATA_FIM_CONTRATO
。这一次,here。
create or replace TRIGGER ANULAR_CONTRATO BEFORE DELETE ON CONTRATO
FOR EACH ROW
DECLARE
valor NUMBER;
juro NUMBER;
cond1 NUMBER;
cond2 NUMBER;
BEGIN
SELECT COUNT(N_FATURA) INTO juro FROM FATURA WHERE EXTRACT(month FROM FATURA.DATA_FATURA) = EXTRACT(month FROM SYSDATE);
valor := 50 + juro;
IF DELETING THEN
IF (MONTHS_BETWEEN(:OLD.DATA_CONTRATO, SYSDATE)) <= 8 THEN
SELECT COUNT(FATURA.CODIGO_CLIENTE) INTO cond1 FROM FATURA, CONTRATO WHERE (FATURA.CODIGO_CLIENTE = CONTRATO.CODIGO_CLIENTE) AND (FATURA_ESTADO = 'Nao Pago');
IF cond1 > 0 THEN
INSERT INTO MENSALIDADE (N_MENSALIDADE, CODIGO_CLIENTE, N_CONTRATO, VALOR, DATA_FIM) VALUES (SEQ_MENSALIDADE.NEXTVAL, :old.CODIGO_CLIENTE, :old.N_CONTRATO, valor ,:old.DATA_FIM_CONTRATO);
END IF;
ELSE
SELECT COUNT(FATURA.ESTADO) INTO cond2 FROM FATURA, CONTRATO WHERE (FATURA.CODIGO_CLIENTE = CONTRATO.CODIGO_CLIENTE) AND (FATURA_ESTADO = 'Nao Pago');
IF cond2 > 0 THEN
INSERT INTO MENSALIDADE (N_MENSALIDADE, CODIGO_CLIENTE, N_CONTRATO, VALOR, DATA_FIM) VALUES (SEQ_MENSALIDADE.NEXTVAL, :old.CODIGO_CLIENTE, :old.N_CONTRATO, valor ,:old.DATA_FIM_CONTRATO);
END IF;
END IF;
END IF;
END ANULAR_CONTRATO;