使用条件参数更新存储过程

UPDATE stored procedure with conditional arguments

我想编写一个 Oracle UPDATE 存储过程,如果 BIT 参数为真,我会在其中重置某些字段。如果 BIT 参数不为真,则更新应采用已经存在的值或跳过更新字段。我怎样才能做到这一点?

我或多或少想要达到的是这个

CREATE OR REPLACE PROCEDURE [dbo].[p_update_fields]
    @ID                  varchar(255),
    @RESET_FIELD_1    boolean,
    @RESET_FIELD_2    boolean,
    @RESET_FIELD_3    boolean
    
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRANSACTION
        IF EXISTS (SELECT id FROM dbo.TABLE_NAME WHERE id = @ID)
            declare field1_;
            declare field2_;
            select t.field1, t.field2 INTO field1_, field2_ FROM dbo.TABLE_NAME t where t.id = @ID
            if(@RESET_FIELD_1 = true) 
               field1_ = null;
            if(@RESET_FIELD_2 = true)
               field2_ = null;
            UPDATE dbo.TABLE_NAME
                SET
                    field1 = field1_,
                    field2 = field2_
            WHERE id = @ID
    END TRANSACTION
    SET NOCOUNT OFF;
END

如果您使用 Oracle,请查看以下示例。我选择不传递布尔值,而是传递数值(它们使用起来更简单;1 代表“真”,0 代表“假”)。

示例数据:

SQL> SELECT * FROM table_name ORDER BY id;

ID       FIELD1     FIELD2     FIELD3
---- ---------- ---------- ----------
A123        100        200        300
B456          1          2          3

程序:

SQL> CREATE OR REPLACE PROCEDURE p_update_fields (par_id       IN VARCHAR2,
  2                                               par_reset_1  IN NUMBER,
  3                                               par_reset_2  IN NUMBER,
  4                                               par_reset_3  IN NUMBER)
  5  IS
  6  BEGIN
  7     UPDATE table_name
  8        SET field1 = CASE WHEN par_reset_1 = 1 THEN NULL ELSE field1 END,
  9            field2 = CASE WHEN par_reset_2 = 1 THEN NULL ELSE field2 END,
 10            field3 = CASE WHEN par_reset_3 = 1 THEN NULL ELSE field3 END
 11      WHERE id = par_id;
 12  END;
 13  /

Procedure created.

测试:让我们为 ID = 'A123' 重置 FIELD1:

SQL> BEGIN
  2     p_update_fields (par_id       => 'A123',
  3                      par_reset_1  => 1,
  4                      par_reset_2  => 0,
  5                      par_reset_3  => 0);
  6  END;
  7  /

PL/SQL procedure successfully completed.

结果:

SQL> SELECT * FROM table_name ORDER BY id;

ID       FIELD1     FIELD2     FIELD3
---- ---------- ---------- ----------
A123                   200        300     --> FIELD1 is now NULL
B456          1          2          3

SQL>