Создать хранимую процедуру для добавления нового столбца на основе другого столбца в таблице (Oracle SQL) - PullRequest
0 голосов
/ 03 ноября 2019

Я новичок в SQL и пытаюсь написать хранимую процедуру, которая будет делать две вещи.

  1. Добавление нового столбца в ранее созданную таблицу.
  2. Заполнение этого нового столбца данными на основе другого столбца в таблице.

Iможно заставить его добавить столбец, это вторая часть, где у меня действительно возникают проблемы.

По сути, я не понимаю, как сказать: «Если значение в этом слоте больше, чем 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;

Ответы [ 2 ]

3 голосов
/ 03 ноября 2019

Вы можете добавить виртуальный столбец в вашу таблицу (Виртуальный столбец: « значения получены, а не сохранены »), например,

Таблица и данные

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

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 здесь .

2 голосов
/ 03 ноября 2019

Я думаю, вы можете напрямую использовать свою логику в своем заявлении об обновлении.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...