2013-08-12 4 views
0

У меня есть две таблицысоздать триггер для получения значений столбцов из другой таблицы

Items 

ITEM_CODE VARCHAR2(20)  
ITEM_NAME VARCHAR2(20) 
PRICE_TON NUMBER(38,5)  
PRICE_REAM NUMBER(38,5)  
PRICE_SHEET NUMBER(38,5) 

Orderitems 

ORDER_ITEMS_CODE VARCHAR2(20)  
ORDER_CODE   VARCHAR2(20)  
ITEM_CODE_ORDERS VARCHAR2(20) 
ORDER_QUANTITY   NUMBER(4,0) 
ORDER_UNIT   VARCHAR2(5) 
UNIT_PRICE   NUMBER(38,5)  

Я хочу, чтобы создать триггер для вычисления unit_price на основе order_unit Я попробовал этот курок, но он не работает

create or replace TRIGGER "Orderitems_T1" 
    BEFORE 
    insert or update on orderitems 
    for each row 
    begin    
    declare 
    order_unit                        orderitems.order_unit%type; 
    unit_price                         orderitems.unit_price%type; 
    price_sheet                      Items.price_sheet%type; 
    price_ream                       Items.price_ream%type; 
    price_ton                           Items.price_ton%type; 
    item_code                         Items.item_code%type; 
    item_code_orders         orderitems.item_code_orders%type; 
    when item_code_orders = item_code then 
  begin 
    case 
    when order_unit ='sheet' then  unit_price :=  price_sheet; 
    when order_unit = 'ton'  then  unit_price := price_ton ; 
    when order_unit = 'ream'  then  unit_price := price_ream ; 
    else unit_price  := 0; 
    end case; 
    end; 
    end; 

Я получаю эту ошибку

PLS-00103: Обнаружен символ «кОГДА», когда ожидает одно из следующих действий: начать функцию ргадт процедуры подтип станд e текущий курсор delete существует до

PLS-00103: Встретил символ «;» когда ожидается одно из следующего: случай Символ «случай» был заменен на «;» продолжать.

+0

Предложение WHEN, которое вы указали, находится не в том месте, но более того, вы указываете одно поле (ITEM_CODE_ORDERS), которое существует в таблице ORDERITEMS, и другое поле (ITEM_CODE), которое существует в таблице ITEMS. Все поля, указанные в предложении WHEN, должны существовать в таблице, в которой работает триггер (в этом случае таблица ORDERITEMS). Измените свой вопрос и объясните, что вы пытаетесь выполнить. Благодарю. –

+0

Я хочу рассчитать unit_price для каждого элемента, вставленного в таблицу ORDERITEMS ,, это (unit_price) зависит от order_unit, если (order_unit) равно 'ton', тогда (unit_price) равно (Price_ton) в таблице ITEMS, когда (item_code) в ITEMS равно (Item_code_orders) в ORDERITEMS – user2648669

ответ

1

Как отмечалось ранее, вы не можете использовать КОГДА пункт, как вы изначально пытались, потому что вы не можете использовать поля из нескольких таблиц в предложении WHEN. Похоже, вам нужно получить строку из ITEMS, у которой есть ITEM_CODE, соответствующий ORDER_ITEMS_CODE на вашей строке ORDER_ITEMS, а затем скопируйте соответствующее поле из строки ITEM_CODE в строку ORDER_ITEMS.

Попробуйте это:

create or replace TRIGGER Orderitems_T1 
    BEFORE insert or update on orderitems 
    for each row 
declare 
    rowItems ITEMS%ROWTYPE; 
begin 
    SELECT * 
    INTO rowItems 
    FROM ITEMS i 
    WHERE i.ITEM_CODE = :NEW.ORDER_ITEMS_CODE; 

    case 
    when :NEW.order_unit = 'sheet' then 
     :NEW.unit_price := rowItems.price_sheet; 
    when :NEW.order_unit = 'ton' then 
     :NEW.unit_price := rowItems.price_ton ; 
    when :NEW.order_unit = 'ream' then 
     :NEW.unit_price := rowItems.price_ream ; 
    else 
     :NEW.unit_price := 0; 
    end case; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('No row found in ITEMS for ' || 
         'ORDERITEMS.ORDER_ITEMS_CODE=''' || 
         :NEW.ORDER_ITEMS_CODE || ''''); 
    RAISE; -- re-raise the error if an invalid item code is found 
end Orderitems_T1; 

Делите и наслаждайтесь.

+0
+0

Я думал, что поле ORDER_UNIT находится в таблице ITEMS. Повторите попытку. –

+0

У меня такие же ошибки. – user2648669

0

Существуют синтаксические ошибки.
Можете ли вы попробовать запустить приведенный ниже код

create or replace TRIGGER "Orderitems_T1" 
BEFORE 
insert or update on orderitems 
for each row 
when (item_code_orders = item_code) 
--begin --remove this begin 
AS 
order_unit      orderitems.order_unit%type; 
unit_price       orderitems.unit_price%type; 
price_sheet      Items.price_sheet%type; 
price_ream      Items.price_ream%type; 
price_ton       Items.price_ton%type; 
item_code       Items.item_code%type; 
item_code_orders   orderitems.item_code_orders%type; 

begin 
case 
when order_unit ='sheet' then unit_price := price_sheet; 
when order_unit = 'ton' then unit_price := price_ton ; 
when order_unit = 'ream' then unit_price := price_ream ; 
else order_unit := 0; 
end case; 
end; 
+0

Я получаю сообщение «ORA-00906 отсутствует левая скобка» – user2648669

+0

отредактировал ответ, пожалуйста, попробуйте сейчас – Harshit

+0

Теперь я получаю ORA-04076: недействительная НОВАЯ или СТАРАЯ спецификация! – user2648669

Смежные вопросы