从选择计数中为变量赋值

Posted

技术标签:

【中文标题】从选择计数中为变量赋值【英文标题】: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;

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

【问题讨论】:

【参考方案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,但这个很长,你坚持我,所以,是的,违反规则!)

以上是关于从选择计数中为变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

如何在字段中为变量赋值?

在 SQL 中为变量的值赋值

PHP:在 IF 语句中为变量赋值

在 JavaScript 中为全局变量列表赋值

在 Swift 中为变量属性赋值的 Objective C 语法

在 C# 的扩展方法中为调用者变量赋值