2015-07-11 2 views
0

Допустим, что клиент 4 желания повысить свой заказ от 23 до 100. Позволяет пользователю ввести:обновление/вставить PL/SQL

  1. Номер 4 для customer_id
  2. 100 для обновленного количества ,

Я хочу написать функцию PL/SQL для получения этих двух значений и обновить таблицу продаж, чтобы отразить это изменение. Распечатайте на экране из основного раздела код общее количество для клиента 4 до и после обновления. Пожалуйста, помогите с использованием этого кода, но не уверены в структуре.

CREATE OR REPLACE TRIGGER orders_before_insert 
BEFORE INSERT 
ON ord 
FOR EACH ROW 

DECLARE 
    v_price NUMBER; 
new number; 
BEGIN 

SELECT pr INTO v_price FROM product where product_id =:new.product_id 
; 

-- Update create_date field to current system date 
:new.total_cost := :new.quantity * v_price; 

END; 
+1

Почему вы не уверены в структуре? Это сработало? Кроме того, почему вы вообще сохраняете total_cost? – GolezTrol

+0

не уверен, как его решить. вы можете мне помочь? – Jaad

ответ

3

Настоящий документ является доказательством процедуры концепции. Он не имеет проверки или обработки ошибок, которые мы ожидаем в правильной процедуре.

create or replace procedure update_order 
    (p_order_id in orders.id%type 
     , p_additional_qty in orders.qty%type 
     , p_orig_total out number 
     , p_new_total out number) 
is 
    l_total number; 
    l_orig number; 
begin 
    update orders 
    set qty = qty + p_additional_qty 
    where id = p_order_id 
    returning (qty - p_additional_qty)* price 
       , qty * price into l_orig, l_total; 
    p_orig_total := l_orig; 
    p_new_total := l_total; 

end update_order; 
/

В SQL * Plus мы используем команду ACCEPT для получения входных значений от пользователя. Мы объявляем переменные для хранения вычисленных значений с помощью VAR и выводим их с помощью PRINT.

Вот тестовые данные:

SQL> select * from orders; 

     ID  QTY  PRICE 
---------- ---------- ---------- 
     42   23  19.99 

SQL> 

А вот как мы называем процедуру с помощью SQL * Plus EXECUTE команду:

SQL> var tot number 
SQL> var orig number 
SQL> accept order_id prompt "enter order ID: " 
enter order ID: 42 
SQL> accept add_qty prompt "please enter add qty: " 
please enter add qty: 77 
SQL> exec update_order (&order_id, &add_qty, :orig, :tot) 

PL/SQL procedure successfully completed. 

SQL> print :orig 

     ORIG 
---------- 
    459.77 

SQL> print :tot 

     TOT 
---------- 
     1999 

SQL> 

Для скрипта, просто поместите все команды в текстовый файл и запустить его в SQL * Plus, как это:

SQL> @your_script.sql 

Обратите внимание, что я отклонился от инструкций вашего задания несколькими способами.

  1. Я не показываю первоначальную общую стоимость аванса. Для этого вам нужно сначала выбрать запись, а затем обновить ее. В реальной жизни мы хотели бы избежать двух операций.
  2. Я вычисляю итоговые суммы, а затем сохраняю их. Опять же, это подход, который мы возьмем в реальной системе. Однако, если в вашей таблице есть столбец TOTAL_COST, вам необходимо внести изменения в UPDATE.
+0

Хорошее решение, используя возврат. Но RETURNING возвращает ** новые ** значения. Это должно быть '(qty - p_additional_qty) * цена' для ORIG и' qty * price'. Пожалуйста, проверьте его - см. Также результат TOT должен быть в 1999 году не ORIG. –

+0

@MarmiteBomber - да, ты прав. Я думаю, я не должен отвечать на вопросы первым делом утром, прежде чем кофе :( – APC

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