首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据表中的其他列创建存储过程以添加新列(Oracle SQL)

根据表中的其他列创建存储过程以添加新列(Oracle SQL)
EN

Stack Overflow用户
提问于 2019-11-03 04:16:32
回答 2查看 1.6K关注 0票数 0

我对SQL很陌生,我试图编写一个存储过程,它将完成两件事。

  1. 将新列添加到先前创建的表中。
  2. 根据表中的另一列填充此新列的数据。

我可以让它增加列,这是第二部分,我真的有麻烦。

基本上,我不明白怎么说,“如果这个槽中的值高于x,就把这个值修改为这个,否则,把这个值修改到这个。”

我可以在任何其他语言中做到这一点,但是SQL与我没有很好的共鸣。

下面基本上就是我想要创造的东西。前两行起作用,差不多。我不知道怎么说,“从这一栏读,做检查,然后将折扣值放入新列。”我的想法是将另一列的值复制到我的新列中,然后从那里修改它。

代码语言:javascript
复制
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;
EN

Stack Overflow用户

发布于 2019-11-03 09:11:43

您可以向表中添加一个虚拟列(虚拟列:"值是派生的,而不是存储的。")

表与数据

代码语言:javascript
复制
create table products ( productstandardprice number( 6, 2 ) ) ;

insert into products ( productstandardprice )
select level * 199.99
from dual
connect by level <= 5 ;

查询

代码语言:javascript
复制
SQL> select * from products ;

PRODUCTSTANDARDPRICE
--------------------
              199.99
              399.98
              599.97
              799.96
              999.95

修改表

代码语言:javascript
复制
alter table products
add (
  saleprice number( 6, 2 ) generated always as (
    case
      when productstandardprice >= 400 then
        productstandardprice * .85 
      else
        productstandardprice * .90
    end
  ) virtual
) ;

同样的查询..。

代码语言:javascript
复制
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

过程

代码语言:javascript
复制
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.

用于测试查询

代码语言:javascript
复制
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 这里.

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58677389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档