[英]Create stored procedure to add new column based on other column in table (Oracle SQL)
我是 SQL 的新手,並試圖編寫一個可以做兩件事的存儲過程。
我可以讓它添加列,這是我真正遇到麻煩的第二部分。
基本上,我不明白怎么說,“如果這個槽中的值高於 x,則將值更改為 this。否則,將值更改為 this。”
我可以用任何其他語言做到這一點,但 SQL 並不能很好地引起我的共鳴。
下面基本上是我想要創建的。 前兩行工作,有點。 我不知道怎么說,“從這個列中讀取,進行檢查,然后將折扣值放入新列中。” 我的想法是將另一列中的值復制到我的新列中,然后從那里更改它。
CREATE OR REPLACE PROCEDURE ProductLineSale
AS
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE Product ADD SalePrice DECIMAL (6,2)';
EXECUTE IMMEDIATE 'UPDATE Product SET SalePrice = ProductStandardPrice';
IF SalePrice >= 400 THEN
SalePrice := SalePrice*.85;
ELSE
SalePrice := SalePrice*.90;
END IF;
END;
您可以在表中添加一個虛擬列(虛擬列:“值是派生的而不是存儲的”),例如
表格和數據
create table products ( productstandardprice number( 6, 2 ) ) ;
insert into products ( productstandardprice )
select level * 199.99
from dual
connect by level <= 5 ;
詢問
SQL> select * from products ;
PRODUCTSTANDARDPRICE
--------------------
199.99
399.98
599.97
799.96
999.95
更改表
alter table products
add (
saleprice number( 6, 2 ) generated always as (
case
when productstandardprice >= 400 then
productstandardprice * .85
else
productstandardprice * .90
end
) virtual
) ;
和以前一樣的查詢...
SQL> select * from products ;
PRODUCTSTANDARDPRICE SALEPRICE
-------------------- ----------
199.99 179.99
399.98 359.98
599.97 509.97
799.96 679.97
999.95 849.96
程序
create or replace procedure productlinesale
is
begin
execute immediate '
alter table products
add (
saleprice number( 6, 2 ) generated always as (
case
when productstandardprice >= 400 then
productstandardprice * .85
else
productstandardprice * .90
end
) virtual
)' ;
end ;
/
Procedure created.
-- caution: this needs the "original" table (without the virtual column)
begin productlinesale; end;
/
PL/SQL procedure successfully completed.
測試查詢
SQL> select
2 productstandardprice
3 , saleprice
4 , round( saleprice / productstandardprice, 2 ) as factor
5 from products
6 ;
PRODUCTSTANDARDPRICE SALEPRICE FACTOR
-------------------- ---------- ----------
199.99 179.99 .9
399.98 359.98 .9
599.97 509.97 .85
799.96 679.97 .85
999.95 849.96 .85
使用 Oracle 11g 和 18c 進行測試。 Dbfiddle 在這里。
我認為您可以直接在更新語句中使用您的邏輯。
CREATE OR REPLACE PROCEDURE ProductLineSale
IS
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE Product ADD SalePrice DECIMAL (6,2)';
EXECUTE IMMEDIATE 'UPDATE Product SET SalePrice =
case when ProductStandardPrice >= 400 THEN ProductStandardPrice*0.85
ELSE ProductStandardPrice*0.9 END';
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.