我有以下表格结构:
Product_Name Product_Id Product_Type
Car 123 A
House ABC B
Ball UZY B
等等…Product Id来自两个不同的Customer feed表(表A和表B,都有Product_Name和Product_id)。一旦他们在任何表上创建了一个新行(插入),一个序列添加一个新的(随机的)Product_Id。我有一个触发器,当新行插入到我的表(用于审计,报告等目的表)时,它基本上试图查找该Product Id:
create or replace TRIGGER "MY_INSERT_ID_TRIGGER"
before insert on "MY_TABLE"
for each row
DECLARE
begin
if :NEW.My_Product_Name is null and lower(:NEW.My_product_type) = 'A'
then
SELECT DISTINCT Product_Id
INTO :NEW.My_product_id
FROM CUSTOMER_PRODUCT_TABLE_A
--To remove special characters and spaces:
WHERE lower( regexp_replace( replace(Product_name, ' ', '') , '[^a-zA-Z ]') )
=
lower( regexp_replace( replace(:NEW.My_Product_name, ' ', '') , '[^a-zA-Z ]') );
elsif :NEW.PRODUCT is null and lower(:NEW.PRODUCT_TYPE) = 'B'
then
SELECT DISTINCT Product_Id
INTO :NEW.My_product_id
FROM CUSTOMER_PRODUCT_TABLE_B
--To remove special characters and spaces:
WHERE lower( regexp_replace( replace(Product_name, ' ', '') , '[^a-zA-Z ]') )
=
lower( regexp_replace( replace(:NEW.My_Product_name, ' ', '') , '[^a-zA-Z ]') );
else null;
end if;
end;
我的表结构如下:
My_product_name My_product_id My_product_type
两个select在独立运行时(在触发器之外)都可以正常工作,但是,触发器本身不会带来任何值。有人知道为什么吗?
感谢这将是SQL结构:
create table CUSTOMER_PRODUCT_TABLE_A
(
Product_Name varchar2(300),
Product_id varchar2(300)
)
create table CUSTOMER_PRODUCT_TABLE_B
(
Product_Name varchar2(300),
Product_id varchar2(300)
)
create table MY_TABLE
(
My_product_name varchar2(300),
My_product_id varchar2(300),
My_product_type varchar2(300)
)
INSERT ALL
INTO CUSTOMER_PRODUCT_TABLE_A (Product_Name, Product_id)
VALUES('Product1-A', 123)
INTO CUSTOMER_PRODUCT_TABLE_A (Product_Name, Product_id)
VALUES('Product2-A', 123)
INTO CUSTOMER_PRODUCT_TABLE_A (Product_Name, Product_id)
VALUES('Product3-A', 123)
INTO CUSTOMER_PRODUCT_TABLE_B (Product_Name, Product_id)
VALUES('Product1-B', 'ABC')
INTO CUSTOMER_PRODUCT_TABLE_B (Product_Name, Product_id)
VALUES('Product2-B', 'DEF')
INTO CUSTOMER_PRODUCT_TABLE_B (Product_Name, Product_id)
VALUES('Product3-B', 'GHI')
SELECT 1 FROM DUAL
所以插入'Product1-A'到My_Table将返回它的Id作为触发器(到我的表列my_product_id)。
感谢这些总是会失败:
lower(:NEW.My_product_type) = 'A'
lower(:NEW.PRODUCT_TYPE) = 'B'