我只是对某事感到好奇。假设我有一个表格,我将更新该值,然后删除它然后插入一个新的1.如果我以这样的方式编写代码将非常容易:
UPDATE PS_EMAIL_ADDRESSES SET PREF_EMAIL_FLAG='N' WHERE EMPLID IN ('K0G004');
DELETE FROM PS_EMAIL_ADDRESSES WHERE EMPLID='K0G004' AND E_ADDR_TYPE='BUSN';
INSERT INTO PS_EMAIL_ADDRESSES VALUES('K0G004', 'BUSN', 'ABS@GNC.COM.BZ', 'Y');
但是,如果使用'update'语句会更容易。但我的问题是,可能在同一时间完成了这3个步骤吗?
答案 0 :(得分:2)
Quoting Oracle Transaction Statements documentation:
交易是一个逻辑的,原子工作单元,其中包含一个或 更多SQL语句。事务将SQL语句分组以便它们 要么都已提交,这意味着它们都应用于 数据库,或所有回滚,这意味着他们从中撤消 数据库。 Oracle数据库为每个事务分配唯一的事务 标识符称为事务ID。
另外,quoting wikipedia Transaction post:
在计算机科学中,ACID(原子性,一致性,隔离, Durability)是一组保证数据库的属性 交易得到可靠处理。
原子性要求每笔交易“全有或全无”:如果有的话 部分事务失败,整个事务失败,并且 数据库状态保持不变。
在您的情况下,您可以将所有三个句子都包含在一个交易中:
COMMIT; ''This statement ends any existing transaction in the session.
SET TRANSACTION NAME 'my_crazy_update'; ''This statement begins a transaction
''and names it sal_update (optional).
UPDATE PS_EMAIL_ADDRESSES
SET PREF_EMAIL_FLAG='N'
WHERE EMPLID IN ('K0G004');
DELETE FROM PS_EMAIL_ADDRESSES
WHERE EMPLID='K0G004' AND E_ADDR_TYPE='BUSN';
INSERT INTO PS_EMAIL_ADDRESSES
VALUES('K0G004', 'BUSN', 'ABS@GNC.COM.BZ', 'Y');
COMMIT;
这是满足您的要求的最佳方法'一次完成所有句子'。
答案 1 :(得分:0)
使用此更新:
UPDATE PS_EMAIL_ADDRESSES
SET
PREF_EMAIL_FLAG = 'N',
E_ADDR_TYPE = 'BUSN',
`column1_name` = 'ABS@SEMBMARINE.COM.SG',
`column2_name` = 'Y'
WHERE EMPLID = 'K0G004';
其中column1_name和column2_name是您用于这些值的列名。
答案 2 :(得分:-1)
编写存储过程以执行所需的所有操作并调用它。那将是一个单一的陈述!