我对SQL很陌生,我试图编写一个存储过程,它将完成两件事。
我可以让它增加列,这是第二部分,我真的有麻烦。
基本上,我不明白怎么说,“如果这个槽中的值高于x,就把这个值修改为这个,否则,把这个值修改到这个。”
我可以在任何其他语言中做到这一点,但是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;发布于 2019-11-03 09:11:43
您可以向表中添加一个虚拟列(虚拟列:"值是派生的,而不是存储的。")
表与数据
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测试w/ Oracle 11g和18c。Dbfiddle 这里.
https://stackoverflow.com/questions/58677389
复制相似问题