2

我只是对某事感到好奇。假设我有一个表,我将更新值,然后将其删除,然后插入一个新的 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');

但是,如果使用“更新”语句会容易得多。但我的问题是,有可能同时完成这 3 个步骤吗?

4

3 回答 3

3

引用 Oracle Transaction Statements 文档

事务是包含一个或多个 SQL 语句的逻辑原子工作单元。事务对 SQL 语句进行分组,以便它们要么全部提交,这意味着它们被应用到数据库,要么全部回滚,这意味着它们从数据库中撤消。Oracle 数据库为每个事务分配一个唯一标识符,称为事务 ID。

另外,引用维基百科交易帖子

在计算机科学中,ACID(原子性、一致性、隔离性、持久性)是一组保证数据库事务得到可靠处理的属性。

原子性要求每个事务都是“全有或全无”:如果事务的一部分失败,则整个事务失败,数据库状态保持不变。

在您的情况下,您可以将所有三个句子包含在一个事务中:

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;

这是满足您“一次完成所有句子”要求的最佳方法。

于 2013-07-16T12:46:30.977 回答
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 是用于这些值的列名。

于 2013-07-15T06:53:53.003 回答
-1

编写一个存储过程来执行您想要的所有操作并调用它。那将是一个单一的声明!

于 2013-07-15T07:52:08.463 回答