我的 Oracle数据库11g 中有3个表:
CREATE TABLE Customer (
cust_id NUMBER PRIMARY KEY,
cust_name VARCHAR2(100),
cust_phone VARCHAR2(20)
);
CREATE TABLE Address (
address_id NUMBER PRIMARY KEY,
address VARCHAR2(500),
area VARCHAR2(100)
);
CREATE TABLE Customer_Address (
cust_id NUMBER REFERENCES Customer ( cust_id ),
Address_id NUMBER REFERENCES Address ( address_id ),
PRIMARY KEY ( cust_id, address_id )
);
现在我想自动将id输入到Customer_Address表中的过程检查电话号码。如果没有。存在于customer表中,使用相应的id else创建一个新的id。
我通过创建一个视图来尝试此操作,其中我插入了客户和地址表的ID,然后使用而不是插入触发器来填充联结表,但它不起作用。
这可以使用序列和触发器来完成吗?或任何其他方式?请帮帮我
答案 0 :(得分:0)
如果你要在数据库中实现业务逻辑(事实上你应该这样做),正确的方法是使用存储过程而不是触发器。
create or replace procedure insert_address
( p_phone_number in customer.cust_phone%type
, p_address in address.address%type
, p_area in address.area%type )
is
l_cust_id customer.cust_id%type;
l_addr_id address.address_id%type;
begin
begin
select c.cust_id
into l_cust_id
from customer c
where c.cust_phone = p_cust_phone;
exception
when no_data_found then
insert into customer
values (customer_id_seq.nextval, 'No name', p_cust_phone)
returning cust_id into l_cust_id;
end;
insert into address
values (address_id_seq.nextval, p_address, p_area)
returning address_id into l_addr_id;
insert into customer_address
values (l_cust_id, l_addr_id);
end;
异常处理和其他细节留给读者练习。
说实话,这是一项人为的练习:IRL客户记录应该在收集地址之前存在。在该方案中,新客户记录不包括客户名称 - 一个相当重要的属性。即使在这个移动电话时代,电话号码也不太可能代理客户的UID。事实上,客户可能拥有多个电话号码。