如何根据使用给定值从两个不同的表中插入表中? [英] How Can I Insert Into Table From Two Different Table Based On Use Given Value?

查看:65
本文介绍了如何根据使用给定值从两个不同的表中插入表中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨伙计们,

我正在尝试创建一个触发器[TrgDisAmount]来从PRODUCT表中读取PROD_NAME和PRICE,并为每个插入的新行计算销售额表的折扣和金额SERIAL和PCODE的值。

表1: PRODUCT

+ ---------- + ---- --------- + ---------- + ------- +

| PCODE | PROD_NAME | PROD_CAT |价格|

+ ---------- + ------------- + ---------- + ----- - +

| MB-101 | IPHONE 6+ | MB | 250 |

| CH-101 |玩具| CH | 95 |

| EL-101 | DEL LAPTOP | EL | 335 |

+ ---------- + ------------- + ---------- + ----- - +



表2:折扣

+ ---------- + --------------- +

| PROD_CAT | DISCOUNT_RATE |

+ ---------- + --------------- +

| MB | 10 |

| CH | 18 |

| EL | 15 |

+ ---------- + --------------- +



表3: SALES

+ -------- + ---------- + -------- ----- + ---------- + ---------- + ------- +

| SERIAL | PCODE | PROD_NAME |价格|折扣| AMOUNT |

+ -------- + ---------- + ------------- + ----- ----- + ---------- + ------- +

| | | | | | |

+ -------- + ---------- + ------------- + ------- --- + ---------- + ------- +



注意:

1)仅输入SERIAL和PCODE的值,其余列应仅由Trigger [TrgDisAmount]输入

2)使用函数[GetDiscount]获取DISCOUNT_RATE。 />
我已经创建了这个函数,它的工作原理是^^。



这是我的尝试,但是当我运行它时说:触发器用编译错误创建

当我显示错误时我发现: PLS-00049:错误的绑定变量'OLD.PRODUCT'



hi guys ,,
i'm trying to create a Trigger [TrgDisAmount] to read PROD_NAME and PRICE from PRODUCT table and to calculate the DISCOUNT and AMOUNT of SALES Table for every new row inserted with the values of SERIAL and PCODE.
Table 1 : PRODUCT
+----------+-------------+----------+-------+
| PCODE | PROD_NAME | PROD_CAT | PRICE |
+----------+-------------+----------+-------+
| MB-101 | IPHONE 6+ | MB | 250 |
| CH-101 | TOY | CH | 95 |
| EL-101 | DEL LAPTOP | EL | 335 |
+----------+-------------+----------+-------+

Table 2 : DISCOUNT
+----------+---------------+
| PROD_CAT | DISCOUNT_RATE |
+----------+---------------+
| MB | 10 |
| CH | 18 |
| EL | 15 |
+----------+---------------+

Table 3 : SALES
+--------+----------+-------------+----------+----------+-------+
| SERIAL | PCODE | PROD_NAME | PRICE | DISCOUNT | AMOUNT|
+--------+----------+-------------+----------+----------+-------+
| | | | | | |
+--------+----------+-------------+----------+----------+-------+

Note:
1) Enter the values for SERIAL and PCODE only, the remaining columns should entered by the Trigger [TrgDisAmount] only
2) Get the DISCOUNT_RATE using Function [GetDiscount].
I have already create the function and it works ^^ .

this is my try ,, but when i run it is says : trigger created with compilation error
when i show error it i found : PLS-00049: bad bind variable 'OLD.PRODUCT'

 create or replace trigger TrgDisAmount 
before insert on SALES
for each row
begin
if  :new.PCODE = :old.PRODUCT.PCODE  then
:new.PROD_NAME :=  :old.PRODUCT.PROD_NAME;
:new.PRICE := :old.PRODUCT.PRICE;
:new.DISCOUNT :=  :old.product.PRICE / (GetDiscount( :old.PRODUCT.PROD_CAT));
:new.AMOUNT := :new.PRICE - :new.DISCOUNT;
end if;
insert into SALES columns (PROD_NAME, PRICE, DISCOUNT, AMOUNT) 
values (:new.PROD_NAME, :new.PRICE, :new.DISCOUNT, :new.AMOUNT );
end;
/





SQL>插入销售值(1,'MB-101',null,null,null,null);

结果应该是

+ -------- + ---------- + - ----------- + ---------- + ---------- + ------- +

| SERIAL | PCODE | PROD_NAME |价格|折扣| AMOUNT |

+ -------- + ---------- + ------------- + ----- ----- + ---------- + ------- +

| 1 | MB-101 | IPHONE 6+ | 250 | 25 | 225 |

+ -------- + ---------- + ------------- + ------- --- + ---------- + ------- +



请帮帮我,谢谢



SQL> insert into sales values (1,'MB-101',null, null, null, null);
RESULT SHOULD BE LIKE
+--------+----------+-------------+----------+----------+-------+
| SERIAL | PCODE | PROD_NAME | PRICE | DISCOUNT | AMOUNT|
+--------+----------+-------------+----------+----------+-------+
| 1 | MB-101 | IPHONE 6+ | 250 | 25 | 225 |
+--------+----------+-------------+----------+----------+-------+

please help me ,, thanks

推荐答案

据我所知,你不能引用像(:old.Product)那样的产品,因为old指的是更新中更新的值,删除触发器。



而不是声明变量并使用选择查询



DECLARE

V_CODE = VARCHAR2;

V_NAME VARCHAR2;

V_PRICE NUMERIC;

V_DISCOUNT NUMERIC;



SELECT P.PCODE ,P.PROD_NAME,P.PRICE,P.PRICE / NVL(D.DISCOUNT_RATE,1)折扣到V_CODE,V_NAME,V_PRICE,V_DISCOUNT来自产品P,折扣D其中P.PROD_CAT = PROD_CAT(+)AND P.PCODE = :new.PCODE





插入SALES栏目(SERIAL,PCODE,PROD_NAME,PRICE,DISCOUNT,AMOUNT)

值(:new.SERIAL,:new.PCODE,V_NAME,V_PRICE,V_DISCOUNT,V_PRICE-V_DISCOUNT);
As I understand you can not refer to product like (:old.Product) since old refers to the values being updated in the update, delete trigger.

Instead of this declare variables and use select query

DECLARE
V_CODE = VARCHAR2;
V_NAME VARCHAR2;
V_PRICE NUMERIC;
V_DISCOUNT NUMERIC;

SELECT P.PCODE, P.PROD_NAME, P.PRICE, P.PRICE/ NVL(D.DISCOUNT_RATE,1) DISCOUNT INTO V_CODE,V_NAME,V_PRICE,V_DISCOUNT FROM PRODUCT P, DISCOUNT D where P.PROD_CAT = PROD_CAT (+) AND P.PCODE = :new.PCODE


insert into SALES columns (SERIAL, PCODE, PROD_NAME, PRICE, DISCOUNT, AMOUNT)
values (:new.SERIAL, :new.PCODE,V_NAME , V_PRICE, V_DISCOUNT, V_PRICE-V_DISCOUNT );


这篇关于如何根据使用给定值从两个不同的表中插入表中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆