![](/img/trans.png)
[英]Oracle PLSQL - How to insert pipeseparated string values into a table
[英]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.