使用条件参数更新存储过程
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>
我想编写一个 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>