繁体   English   中英

我们可以在 plsql oracle 中使用 cursor 将值插入表中吗

[英]can we insert values into table using cursor in plsql oracle

当我运行 sql 时,我想将每日交易的贷方和借方的总和从一个表插入另一个表,它提供多行功能,但是当我插入 plsql 中的另一个表时,它会阻止它给出错误

    '''
    CREATE TABLE TRANSACTION_DAILY(
    T_DATE  DATE,
    CREDIT  NUMBER,
    DEBIT   NUMBER
    );
    CREATE TABLE TRANSACTION_DAILY_total(
    T_DATE  DATE,
    total_CREDIT  NUMBER,
    total_DEBIT   NUMBER
    );
    CREATE OR REPLACE trigger PRO_DAILY 
    after insert on transaction_daily
    declare
    CREDIT TRANSACTION_DAILY.credit%type ;
    DEBIT TRANSACTION_DAILY.debit%type ;
    n_date TRANSACTION_DAILY.t_date%type;
    cursor c_daily
    is
    SELECT SUM( CREDIT ), SUM(DEBIT)
    FROM TRANSACTION_DAILY
    group by t_date;
    BEGIN
    open c_daily;
    fetch c_daily bull collect into  credit,debit,n_date;
    INSERT INTO TRANSACTION_DAILY_TOTAL (T_DATE,TOTAL_CREDIT,TOTAL_DEBIT) VALUES 
    (N_DATE,CREDIT,DEBIT);
    close c_daily;
    END;
     '''

您不需要 cursor。 实际上,您根本不需要(也不想要)触发器。 这就是为什么。

修复后,触发器如下所示:

SQL> CREATE OR REPLACE TRIGGER pro_daily AFTER
  2      INSERT ON transaction_daily
  3  BEGIN
  4      INSERT INTO transaction_daily_total (
  5          t_date,
  6          total_credit,
  7          total_debit
  8      )
  9          SELECT
 10              t_date,
 11              SUM(credit),
 12              SUM(debit)
 13          FROM
 14              transaction_daily
 15          GROUP BY
 16              t_date;
 17  END;
 18  /

Trigger created.

SQL>

它有效吗? 当然:

SQL> insert into transaction_daily (t_date, credit, debit)
  2    select date '2021-12-10', 100, 50 from dual union all
  3    select date '2021-12-10', 200, 75 from dual union all
  4    select date '2021-10-14', 500, 20 from dual;

3 rows created.

SQL> select * From transaction_daily_total;

T_DATE     TOTAL_CREDIT TOTAL_DEBIT
---------- ------------ -----------
2021-12-10          300         125
2021-10-14          500          20

SQL>

正如预期的那样,transaction_daily_total 包含这两个日期的总计 但是,如果我们只插入另一行呢?

SQL> insert into transaction_daily(t_date, credit, debit)
  2    values (date '2021-12-01', 1, 1);

1 row created.

SQL> select * From transaction_daily_total;

T_DATE     TOTAL_CREDIT TOTAL_DEBIT
---------- ------------ -----------
2021-12-10          300         125
2021-10-14          500          20
2021-12-10          300         125
2021-10-14          500          20
2021-12-01            1           1

SQL>

哎呀? 重复! 你确定你真的希望这种情况发生吗?


你该怎么办? 正如我所说 - 放弃触发器和“总”表的想法并切换到视图

SQL> create or replace view v_transaction_daily_total as
  2    select t_date, sum(credit) credit, sum(debit) debit
  3    from transaction_daily
  4    group by t_date;

View created.

SQL> select * From v_transaction_daily_total;

T_DATE         CREDIT      DEBIT
---------- ---------- ----------
2021-12-10        300        125
2021-10-14        500         20
2021-12-01          1          1

SQL>

插入另一行? 视图没有问题:

SQL> insert into transaction_daily(t_date, credit, debit)
  2    values (date '2021-12-02', 50, 50);

1 row created.

SQL> select * From v_transaction_daily_total;

T_DATE         CREDIT      DEBIT
---------- ---------- ----------
2021-12-10        300        125
2021-10-14        500         20
2021-12-02         50         50
2021-12-01          1          1

SQL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM