需要什么代码才能有条件地为 beforeinsert 触发器中的字段提供值?
What code is needed to conditionally provide a value to a field in a beforeinsert trigger?
我需要在 table 的字段中存储字符串值,特别是在其 Subcategory VarChar(50)
列中。
在此 post 处理之前 Subcategory
的值是 0 或 1;我需要将其更改为更人性化的值。
我已经几十年没有创建数据库触发器了,需要一些代码方面的帮助。这是我的伪 SQL(SQL 和 VB 的大杂烩):
CREATE OR REPLACE TRIGGER tr_CustomerCategoryLog_BeforeInsert
BEFORE INSERT ON CustomerCategoryLog FOR EACH ROW
DECLARE _Category = :new.Category;
DECLARE _Subcategory = :new.Subcategory;
BEGIN
If _Category = "New"
If _Subcategory = 0
:new.Subcategory := 'New';
End If
Else If _Subcategory = 1
:new.Subcategory := 'Assumed';
End If
End If
If _Category = "Existing"
If _Subcategory = 0
:new.Subcategory := 'Existing';
End If
Else If _Subcategory = 1
:new.Subcategory := 'Organic'
End If
End If
Return "Unknown"
End Function
END;
如果逻辑不清楚,半通俗的英语是:
如果Category字段的值为"New",如果Subcategory的值当前为0,则将Subcategory字段的值也设置为"New";否则,将其设置为 "Assumed"
如果Category字段的值为"Existing",如果Subcategory的值当前为0,则将Subcategory字段的值也设置为"Existing";否则,将其设置为 "Organic"
也许我需要听听 Steely Dan 的专辑 "Trigger Logic"。
更新
我认为答案可行,但对我来说还不够完整。
因为我显然在上面的伪 SQL 中混淆了 Oracle 代码,完整的代码需要是什么样的(在 CustomerCategoryLog table 上创建一个 BeforeInsert 触发器)?
这样更像吗:
CREATE TRIGGER tr_CustomerCategoryLog_BeforeInsert
ON CustomerCategoryLog
INSTEAD OF INSERT
AS
BEGIN
SELECT
CASE
WHEN @Category = 'New'
THEN CHOOSE(@Subcategory + 1, 'New', 'Assumed')
WHEN @Category = 'Existing'
THEN CHOOSE(@Subcategory + 1, 'Existing', 'Organic')
ELSE 'Unknown'
END
END
?
我倾向于避免触发(也许是性格缺陷......我也不喜欢土豆泥),但下面的插图可以简化你的逻辑
Declare @Category varchar(50) = 'Existing'
Declare @Subcategory int = 1 -- works if BIT
Select case when @Category = 'New' then choose(@Subcategory+1,'New','Assumed')
when @Category = 'Existing' then choose(@Subcategory+1,'Existing','Organic')
else 'Unknown' end
Returns
Organic
我需要在 table 的字段中存储字符串值,特别是在其 Subcategory VarChar(50)
列中。
在此 post 处理之前 Subcategory
的值是 0 或 1;我需要将其更改为更人性化的值。
我已经几十年没有创建数据库触发器了,需要一些代码方面的帮助。这是我的伪 SQL(SQL 和 VB 的大杂烩):
CREATE OR REPLACE TRIGGER tr_CustomerCategoryLog_BeforeInsert
BEFORE INSERT ON CustomerCategoryLog FOR EACH ROW
DECLARE _Category = :new.Category;
DECLARE _Subcategory = :new.Subcategory;
BEGIN
If _Category = "New"
If _Subcategory = 0
:new.Subcategory := 'New';
End If
Else If _Subcategory = 1
:new.Subcategory := 'Assumed';
End If
End If
If _Category = "Existing"
If _Subcategory = 0
:new.Subcategory := 'Existing';
End If
Else If _Subcategory = 1
:new.Subcategory := 'Organic'
End If
End If
Return "Unknown"
End Function
END;
如果逻辑不清楚,半通俗的英语是:
如果Category字段的值为"New",如果Subcategory的值当前为0,则将Subcategory字段的值也设置为"New";否则,将其设置为 "Assumed"
如果Category字段的值为"Existing",如果Subcategory的值当前为0,则将Subcategory字段的值也设置为"Existing";否则,将其设置为 "Organic"
也许我需要听听 Steely Dan 的专辑 "Trigger Logic"。
更新
我认为答案可行,但对我来说还不够完整。
因为我显然在上面的伪 SQL 中混淆了 Oracle 代码,完整的代码需要是什么样的(在 CustomerCategoryLog table 上创建一个 BeforeInsert 触发器)?
这样更像吗:
CREATE TRIGGER tr_CustomerCategoryLog_BeforeInsert
ON CustomerCategoryLog
INSTEAD OF INSERT
AS
BEGIN
SELECT
CASE
WHEN @Category = 'New'
THEN CHOOSE(@Subcategory + 1, 'New', 'Assumed')
WHEN @Category = 'Existing'
THEN CHOOSE(@Subcategory + 1, 'Existing', 'Organic')
ELSE 'Unknown'
END
END
?
我倾向于避免触发(也许是性格缺陷......我也不喜欢土豆泥),但下面的插图可以简化你的逻辑
Declare @Category varchar(50) = 'Existing'
Declare @Subcategory int = 1 -- works if BIT
Select case when @Category = 'New' then choose(@Subcategory+1,'New','Assumed')
when @Category = 'Existing' then choose(@Subcategory+1,'Existing','Organic')
else 'Unknown' end
Returns
Organic