【问题标题】:Assigning value to variable from a select count从选择计数中为变量赋值
【发布时间】:2014-11-23 17:17:07
【问题描述】:

所以我最近一直在用 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 并且如果它们在 FTURA 中有任何寄存器,其中 ESTADO 是 'Nao,则插入到 MENSALIDADE 表中的触发器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;

第一个错误可能我无法做我正在做的事情,但对于如何正确完成它的一些帮助将不胜感激。 第三个我不知道为什么会发生。谢谢!

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    这会有所帮助:

     SELECT COUNT(N_FATURA) into juro
     FROM FATURA 
     WHERE (EXTRACT(month FROM FATURA.DATA_FATURA) = (EXTRACT(month FROM SYSDATE)));

    【讨论】:

      【解决方案2】:

      您需要在PL/SQL 中使用SELECT INTO 来设置从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;
      

      【讨论】:

      • Error(8,10): PLS-00204: function or pseudo-column 'EXISTS' may be used inside a SQL statement only 这发生在第 8 行和第 14 行
      • 我通过比较计数替换 IF EXISTS 子句并消除不必要的 IF 子句来更新我的答案。
      • 它纠正了很多东西,但它现在有这个错误(18,193):PL / SQL:ORA-00984:此处不允许列(已翻译但直接转到此)在线18 和 13. 它抱怨 CONTRATO.DATA_FIM_CONTRATO 插入 DATA_FIM,它们都是 DATE(类型)与它有什么关系?
      • 和你一起学习。 :) 我已尝试更正您获得已删除行值的部分。
      • ahhh 当然,我记得在 if 中而不是那里......典型的错误:p 谢谢(我知道要避免感谢 cmets,但这个很长,你坚持我,所以,是的,违反规则!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多