簡體   English   中英

更新/插入PL / SQL

[英]update/insert PL/SQL

假設客戶4希望將其訂單從23個增加到100個。使用戶能夠輸入:

  1. customer_ID的數字4
  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;

這是概念證明程序。 它沒有我們期望在適當過程中進行的驗證或錯誤處理。

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進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM