问题描述
我的问题是
我是一名店主,如果在自动按顺序排列令牌号后,数据库中的两个和三个客户被删除,我将为数据库中的每个客户提供一个令牌号。那么如何在pl/sql中解决这个问题
我是一名店主,如果在自动按顺序排列令牌号后,数据库中的两个和三个客户被删除,我将为数据库中的每个客户提供一个令牌号。那么如何在pl/sql中解决这个问题
专家解答
简单的方法-只是不存储该序列-您可以动态地导出令牌编号,例如
如果您确实需要存储它,那么您可以使用相同的工具来更新表中的列-但这也意味着,对于每个删除的客户,您确实必须锁定整个表,因为潜在地每个客户都更新了。
SQL> create table customer
2 (
3 customer_id int primary key,
4 customer_name varchar2(100)
5 );
Table created.
SQL>
SQL> insert into customer values (1,'John');
1 row created.
SQL> insert into customer values (2,'Sue');
1 row created.
SQL> insert into customer values (3,'Mary');
1 row created.
SQL> insert into customer values (4,'Peter');
1 row created.
SQL> insert into customer values (5,'Maria');
1 row created.
SQL> insert into customer values (6,'Steven');
1 row created.
SQL>
SQL> create or replace view customer_token as
2 select c.*, row_number() over ( order by customer_name ) as token
3 from customer c;
View created.
SQL>
SQL> select * from customer_token;
CUSTOMER_ID CUSTOMER_NAME TOKEN
----------- -------------------- ----------
1 John 1
5 Maria 2
3 Mary 3
4 Peter 4
6 Steven 5
2 Sue 6
6 rows selected.
SQL>
SQL> delete from customer where customer_id in (3,4);
2 rows deleted.
SQL>
SQL> select * from customer_token;
CUSTOMER_ID CUSTOMER_NAME TOKEN
----------- -------------------- ----------
1 John 1
5 Maria 2
6 Steven 3
2 Sue 4
4 rows selected.
如果您确实需要存储它,那么您可以使用相同的工具来更新表中的列-但这也意味着,对于每个删除的客户,您确实必须锁定整个表,因为潜在地每个客户都更新了。
SQL> drop view customer_token;
View dropped.
SQL>
SQL> alter table customer add token int;
Table altered.
SQL>
SQL> drop table tmp purge;
Table dropped.
SQL>
SQL> create global temporary table tmp ( customer_id int primary key, tk int );
Table created.
SQL>
SQL> insert into tmp select customer_id, row_number() over ( order by customer_name ) as tk
2 from customer;
4 rows created.
SQL>
SQL> update
2 ( select c.customer_id, c.token, t.tk
3 from customer c, tmp t
4 where c.customer_id = t.customer_id
5 )
6 set token = tk;
4 rows updated.
SQL>
SQL>
SQL> create or replace
2 trigger cust_trg
3 after delete on customer
4 begin
5 lock table customer in exclusive mode;
6 delete tmp;
7
8 insert into tmp select customer_id, row_number() over ( order by customer_name ) as tk
9 from customer;
10
11 update
12 ( select c.customer_id, c.token, t.tk
13 from customer c, tmp t
14 where c.customer_id = t.customer_id
15 )
16 set token = tk
17 where token != tk;
18 end;
19 /
Trigger created.
SQL>
SQL> delete from customer where customer_id = 1;
1 row deleted.
SQL>
SQL> select * from customer;
CUSTOMER_ID CUSTOMER_NAME TOKEN
----------- -------------------- ----------
2 Sue 3
5 Maria 1
6 Steven 2
3 rows selected.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




