【发布时间】:2019-02-23 12:44:44
【问题描述】:
我在 Microsoft SQL Server 中创建了一个触发器,我正试图将其引入 Oracle SQL Developer。我意识到语法和语言有点不同。我正在缓慢但肯定地尝试通过每一行,但非常感谢任何帮助或指导。
我尝试将 Microsoft SQL Server 中的触发器转移到 Oracle:
CREATE TRIGGER Production.Product_Price_Check
ON AdventureWorks.Production.Product FOR UPDATE
AS
DECLARE @min_price money; --to keep minimum price
DECLARE @new_price money; --to keep new price from update query
SELECT @min_price = (SELECT StandardCost*1.2 FROM INSERTED);
SELECT @new_price = (SELECT ListPrice FROM INSERTED)
IF @new_price < @min_price
BEGIN
ROLLBACK TRANSACTION
-- Rolls back an explicit or implicit transaction to the beginning of the transaction
PRINT('the price can’t be below ' + cast(@min_price as varchar(20)));
-- cast is used to convert one data type to another one
RAISERROR ('statement was aborted', 6, 1) ;
return;
ELSE PRINT ('Price was successfully changed');
END
GO
我将在我正在研究的过程中使用新触发器发布我所在位置的更新:
UPDATE Product set ListPrice=42.00 WHERE ProductID=514;
更新代码:
CREATE OR REPLACE
TRIGGER Product_Price_Check
BEFORE UPDATE ON Product
FOR EACH ROW
BEGIN
IF :new.listprice < :new.standardcost * 1.2 then
raise_application_error(-20999, 'The price can not be below' || to_char(:new.standardcost * 1.2));
RETURN;
ELSE
dbms_output.put_line('Price was sucessfully changed');
END IF;
END;
快速创建我正在使用的表的示例代码:
CREATE TABLE Product(
productID int Primary Key,
name VARCHAR(250),
ListPrice int Primary Key,
StandardCost NUMBER(10,4),
);
INSERT INTO Product VALUES(514, 'NLL Mountain Seat Assembly', 133.3400, 98.7700);
【问题讨论】:
-
我们无法为您编写代码,如果您展示您的尝试以及您面临的具体错误,您将获得一些帮助
-
你不能在触发器中
rollback -
为什么要复制损坏的触发器?
inserted可以包含 0、1 或 多个 行。此触发器使用该表中的两个单独的SELECTs 设置变量,这将采用一行的值并忽略其余的值(不保证它们甚至来自同一行)。起点不好。 -
另外,看起来这应该只是一个
CHECK约束。 -
我是这个超级新手
标签: oracle plsql database-trigger