我想撰寫一個 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
uj5u.com熱心網友回復:
如果您確實使用 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.
測驗:讓我們只FIELD1為ID = 'A123':
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/481650.html
上一篇:出現重復的INSERTINTOTABLEVALUES,跳過該特定插入而不會出錯,然后執行下一個INSERT陳述句
