快速提升Oracle视图更新能力(oracle如何更新视图)

随着由Oracle开发的软件不断成熟,用视图(View)来表示从一张或多张数据表中获取的数据是很普遍的事情,很多时候,会去更新一些列或者一行或者几行,从而改变视图中的值。但是,有时候,更新视图需要一些操作才能达到预期的效果,这一般需要一定的实践技能和经验。本文给出的技巧可以帮助提升Oracle视图更新能力。

**1.使用INSTEAD OF触发器更新视图**

假如我们有一张表名为Employees和一个视图名为EmployeeView,同时也有一个INSTEAD OF触发器(trigger),EmployeeView在真实表Employees的基础上做了一层加工,我们想要更新视图EmployeeView,比如在视图EmployeeView上更新一行数据:

“`SQL

UPDATE EmployeeView SET FirstName = ‘John’ WHERE EmpId = 1;


在这种情况下,INSTEAD OF触发器会被自动激活,INSTEAD OF触发器会改变传到视图的更新请求,通过触发器,我们可以直接去更新真实的表,进而达到更新视图的效果:

```SQL
CREATE OR REPLACE TRIGGER EmployeeViewView_InsteadOf_update
INSTEAD OF UPDATE ON EmployeeView
FOR EACH ROW
BEGIN
UPDATE Employees SET FirstName=:NEW.FirstName
WHERE Id = :OLD.EmpId;
END;

**2. 使用JOIN/ MERGE语句更新视图**

如果我们有一个视图,可以将多张表合并起来,我们也可以使用JOIN/MERGE语句去更新视图。比如,假如我们有一个Employees表中的字段FirstName,在后续更新中,我们想要修改Employees表中的FirstName,我们可以如此来更新视图:

“`SQL

MERGE INTO EmployeeView v

USING (SELECT EmpId, FirstName FROM Employees) e

ON (v.EmpId = e.EmpId)

WHEN MATCHED THEN UPDATE

SET v.FirstName = ‘John’


在上面的语句中,我们添加了一个USER子句,Sub-Query语句从数据库中取出EmpId和FirstName字段,ON子句中指出我们将EmpId从Employees表中取出,当它匹配视图上的ID时,如果匹配,就把FirstName更新为新值“John”。

**3. 使用PL/SQL更新视图**

PL/SQL语言也可以用于更新视图,PL/SQL语句将使用游标,允许用户更新多行,比如我们想要把所有FirstName都更新为“John”:

```SQL
DECLARE
CURSOR employees_cur IS
SELECT EmpId, FirstName FROM employees;
BEGIN
FOR employee_rec IN employees_cur
LOOP
UPDATE EmployeeView SET FirstName = 'John' WHERE EmpId = employee_rec.EmpId;
END LOOP;
END;

以上三种方法可以帮助我们更加快速有效的更新视图,但是,当你使用上面的技术时,你也需要知道这些有可能会带来的影响,比如临时表的更新,或者数据一致性的问题,最终,根据实际情况和以下方法,来进行视图更新,这是提升Oracle视图更新能力最佳的方案。


数据运维技术 » 快速提升Oracle视图更新能力(oracle如何更新视图)