如何在oracle上选择性更新数据?

How to optional update data on oracle?

我有这个 table:

CREATE TABLE "ALMAT"."PRODUCT" 
   (    "ID" NUMBER(*,0) NOT NULL ENABLE, 
    "NAME" VARCHAR2(50 BYTE), 
    "PRICE" NUMBER(*,0), 
    "DESCRIPTION" VARCHAR2(180 BYTE), 
    "CREATE_DATE" DATE, 
    "UPDATE_DATE" DATE, 
CONSTRAINT "PRODUCT_PK" PRIMARY KEY ("ID"))

我想更新这个table中的数据,这是我的存储过程:

CREATE OR REPLACE PROCEDURE UPDATEPRODUCT(prod_id int, prod_name varchar2 default null, prod_price int default null) AS 
BEGIN
    
    
    update product
        set
        name = prod_name,
        price = prod_price,
        update_date = sysdate
        where id = prod_id;
        commit;
    
    
END UPDATEPRODUCT;

我使用可选参数,我如何才能只更新 1 列?例如:只有“NAME”或“PRICE”。

您可以在这里使用NVL功能。所以你的更新程序看起来很像 -

CREATE OR REPLACE PROCEDURE UPDATEPRODUCT(prod_id    int,
                                          prod_name  varchar2 default null,
                                          prod_price int      default null) AS
BEGIN
    UPDATE product
       SET name = NVL(prod_name, name),
           price = NVL(prod_price, price),
           update_date = sysdate
     WHERE id = prod_id;

    COMMIT;
    
EXCEPTION
         WHEN OTHERS THEN
              RAISE;
END UPDATEPRODUCT;

使用COALESCE(或NVL)在传入NULL值时保持当前值(或使用默认值):

CREATE OR REPLACE PROCEDURE UPDATEPRODUCT(
  prod_id    PRODUCT.ID%TYPE,
  prod_name  PRODUCT.NAME%TYPE  DEFAULT NULL,
  prod_price PRODUCT.PRICE%TYPE DEFAULT NULL
)
AS 
BEGIN
  UPDATE product
  SET   name        = COALESCE(prod_name, name),
        price       = COALESCE(prod_price, price),
        update_date = SYSDATE
  WHERE id = prod_id;
END UPDATEPRODUCT;

此外,不要 COMMIT 在存储过程中,因为它会阻止您在单个事务中将多个过程链接在一起并将它们作为一个块回滚。相反,COMMIT 来自调用该过程的 PL/SQL 块。