【问题标题】:can we insert values into table using cursor in plsql oracle我们可以在plsql oracle中使用游标将值插入表中吗
【发布时间】:2022-01-18 01:59:45
【问题描述】:

我想将每日交易的贷方和借方总和从一张表插入另一张表 当我运行 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;

【问题讨论】:

  • 强烈建议您删除您的问题,然后对其进行编辑以正确使用大小写。人们将所有大写字母视为大喊大叫,人们有时仅以此为基础投反对票。 (他们不应该,但应该这样做。:-))

标签: sql oracle plsql


【解决方案1】:

你不需要光标。实际上,您根本不需要(也不想要)触发器。原因如下。

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

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>

【讨论】:

  • 谢谢你的回答,很有用
  • 你能解释一下为什么你在 insert 中使用 union all 而不是使用常规的 insert 语句
  • 没有特别的原因。不想输入单独的 INSERT 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2022-07-01
  • 2015-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多