【问题标题】:SQL: implementing a stored procedure or triggerSQL:实现存储过程或触发器
【发布时间】:2023-04-02 21:48:02
【问题描述】:

我正在使用 Sql Developer 和 Oracle。

我需要在数据库中实施一个系统,以便一旦客户的供应被切断,负责的个人或企业 账单将无法在不同的服务地址创建新帐户,直到 等他们的欠款已经清偿。这需要使用触发器或存储过程来实现。

这是我尝试过的

    create or replace PROCEDURE NONEWACCOUNT(newcustomerID in number, 
                                             newStatus in varchar)
                                              AS
begin

      select 
      from a2_watermeter
      where customerid = newcustomerid and Status = newStatus;

      if (newStatus = 'Inactive') then
          DBMS_OUTPUT.put_line('Can not make new account as customer has to pay his/or account');
      end if;
      end;

下面是我的数据库。

但由于我对 sql 完全陌生,我不知道要更改什么

向任何能对此有所了解的人干杯。

我的数据库

    a2_METERREADER

 - EMPLOYEEID
 - FIRSTNAME
 - LASTNAME

a2_READING

 - READINGID
 - METERID
 - EMPLOYEEID
 - BILLNUMBER
 - READING
 - DATERECORD

a2_Watermeter

 - METERID
 - ADDRESS
 - SUBURB
 - POSTCODE
 - STATUS
 - CUSTOMERID
 - REPLACE
 - INSTALLDATE

 a2_customer

    - customerid
    - firstname
    - lastname
    - address
    - suburb
    - postcode
    - email
    - phone
    - businessname
    - dateofbirth

 a2_bill

    - billnumber
    - address
    - suburb
    - postcode
    - customerid
    - readingid
    - amount
    - reading
    - firstname
    - lastname
    - paid
    - duedate

【问题讨论】:

  • 我不会在这种不道德的商业案例上合作;-)
  • 嘿,你完全改变了问题

标签: sql oracle stored-procedures triggers


【解决方案1】:
CREATE OR REPLACE PROCEDURE 
    procname
IS
    rec a2_watermeter%ROWTYPE;
    CURSOR cur
        IS
            SELECT
                *
            FROM
                a2_watermeter
            WHERE
                status = 'active'
            FOR UPDATE;
BEGIN
    OPEN cur;
    LOOP
        FETCH cur INTO rec;
        EXIT WHEN cur%NOTFOUND;

        IF (SYSDATE - (
                  SELECT MIN(duedate) 
                  FROM a2_bill b 
                  WHERE b.customerid = rec.customerid AND b.paid = FALSE
                  GROUP BY(customerid, paid)
                  )) > 60 
        THEN
            UPDATE
                a2_watermeter w
            SET
                status = 'inactive'
            WHERE CURRENT OF cur;
        END IF;
    END LOOP;
    CLOSE cur;

END;

【讨论】:

  • 不断出现错误 PLS-00103 在预期以下情况之一时遇到了 sysmbol“文件结尾”:开始案例.....继续,关于如何修复的任何想法?在网上查找告诉我我需要一个 if 语句
  • 我认为光标有点像数组。
  • @CoolDude21 游标允许您逐步遍历关系的每个元组。在这种情况下,a2_watermeter 关系中的每个元组
  • 得到同样的错误,但这次它在 (21,19) 遇到符号“SELECT”
  • @CoolDude21 哦,是的,布尔评估可能需要括号 - tbh 可能存在一些类似的小错误 - 我在脑海中写下了这个并且没有你的数据库来测试它
【解决方案2】:

你需要写a stored procedure,而不是触发器。可以从a scheduled job 调用存储过程,可能每天一次。触发器响应 DML 活动而触发,这是不可预测的。

您并没有真正提供太多信息,因此很难为您提供定义解决方案。此外,为您完成工作不是我们在 SO 上的职责。但存储过程的核心将是这样的查询:

select *
from a2_bill
where paid = 'NO'
and duedate <= (sysdate - interval '60' day)

【讨论】:

    【解决方案3】:

    您可以创建具有计算值状态的视图。这可以在您的程序中使用并在其他地方使用。这样业务逻辑就在一个地方 像这样的:

    create view customerstatus  
    select c.customerid
    ,      decode(b.custimerid,null,'Active','Inactive') as status
    from customer c
    left outer join bill b on (b.customerid = c.custimerid)
    where b.payed = 'N'
    and b.duedate <= (sysdate - interval '60' day);
    

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多