簡體   English   中英

創建存儲過程以基於表中的其他列添加新列(Oracle SQL)

[英]Create stored procedure to add new column based on other column in table (Oracle SQL)

我是 SQL 的新手,並試圖編寫一個可以做兩件事的存儲過程。

  1. 將新列添加到先前創建的表中。
  2. 使用基於表中另一列的數據填充此新列。

我可以讓它添加列,這是我真正遇到麻煩的第二部分。

基本上,我不明白怎么說,“如果這個槽中的值高於 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.

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