4 回答

TA貢獻1775條經驗 獲得超11個贊
如果表 1 上的任何更新調用觸發器來更新表 2 數據,您可以使用觸發器來表示表 1 并編寫觸發器。
它開始像.. 在 Table1 上為每一行
插入或更新后創建或替換 TRIGGER trigger_name ...
有關完整的觸發器,請參閱(https://www.tutorialspoint.com/plsql/plsql_triggers.htm)

TA貢獻1844條經驗 獲得超8個贊
解決方案 1:您可以在 PLSQL 過程/函數中添加兩個更新語句并在 java 代碼中執行相同的語句
解決方案 2:您可以在函數中添加兩個更新語句并調用相同的

TA貢獻1818條經驗 獲得超3個贊
您不能在一個語句中更新 2 個表(超過一個),而是使用 2 個語句并在帶有注釋的方法中調用它們@Transactional
@Transactional
public void updateTables() {
updateTableOne();
updateTableTwo();
}
當兩個表都存在方法時,將發生提交。
查看更多關于在 Spring 中使用@Transactional
其他選項是調用oracle 程序
Spring 在 JDBC 上提供了多種抽象方式來調用數據庫存儲過程。
例子
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("MOVE_TO_HISTORY")

TA貢獻1828條經驗 獲得超13個贊
Oracle 這樣做的方式是在視圖上使用而不是觸發器。
這是一個基于 Scott 模式的示例。
首先,我將創建一個視圖作為兩個表的連接,EMP并且DEPT(這就是一起更新兩個表進入游戲的地方):
SQL> create or replace view v_ed as
2 select d.deptno, e.empno, d.dname, e.ename, e.sal
3 from emp e join dept d on e.deptno = d.deptno;
View created.
現在,一個代替觸發器。我正在處理INSERT和UPDATE;你也可以添加DELETE。這意味著 - 當您插入或更新視圖時,基礎表將成為這些命令的最終目標。
SQL> create or replace trigger trg_io_ed
2 instead of insert or update on v_ed
3 for each row
4 begin
5 if inserting then
6 insert into emp (deptno, empno, ename, sal)
7 values (:new.deptno, :new.empno, :new.ename, :new.sal);
8 insert into dept (deptno, dname)
9 values (:new.deptno, :new.dname);
10 elsif updating then
11 update emp set
12 deptno = :new.deptno,
13 ename = :new.ename,
14 sal = :new.sal
15 where empno = :new.empno;
16 update dept set
17 dname = :new.dname
18 where deptno = :new.deptno;
19 end if;
20 end;
21 /
Trigger created.
一些測試insert:
SQL> insert into v_ed (deptno, empno, dname, ename, sal)
2 values (99, 100, 'test dept', 'Littlefoot', 1000);
1 row created.
SQL> select * From dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
99 test dept
SQL> select * From emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17.12.80 800 20
7499 ALLEN SALESMAN 7698 20.02.81 1600 300 30
7521 WARD 7698 22.02.81 1250 500
7566 JONES MANAGER 7839 02.04.81 2975 20
7654 MARTIN SALESMAN 7698 28.09.81 1250 1400 30
7698 BLAKE MANAGER 7839 01.05.81 2850
7782 CLARK MANAGER 7839 09.06.81 2450 10
7788 SCOTT ANALYST 7566 09.12.82 3000 20
7839 KING PRESIDENT 17.11.81 5000 10
7844 TURNER SALESMAN 7698 08.09.81 1500 0 30
7876 ADAMS CLERK 7788 12.01.83 1100 20
7900 JAMES CLERK 7698 03.12.81 950 30
7902 FORD ANALYST 7566 03.12.81 3000 20
7934 MILLER CLERK 7782 23.01.82 1300 10
100 Littlefoot 1000 99
15 rows selected.
SQL>
Update:
SQL> update v_ed set ename = 'Bigfoot' where empno = 100;
1 row updated.
SQL> select * From emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17.12.80 800 20
7499 ALLEN SALESMAN 7698 20.02.81 1600 300 30
7521 WARD 7698 22.02.81 1250 500
7566 JONES MANAGER 7839 02.04.81 2975 20
7654 MARTIN SALESMAN 7698 28.09.81 1250 1400 30
7698 BLAKE MANAGER 7839 01.05.81 2850
7782 CLARK MANAGER 7839 09.06.81 2450 10
7788 SCOTT ANALYST 7566 09.12.82 3000 20
7839 KING PRESIDENT 17.11.81 5000 10
7844 TURNER SALESMAN 7698 08.09.81 1500 0 30
7876 ADAMS CLERK 7788 12.01.83 1100 20
7900 JAMES CLERK 7698 03.12.81 950 30
7902 FORD ANALYST 7566 03.12.81 3000 20
7934 MILLER CLERK 7782 23.01.82 1300 10
100 Bigfoot 1000 99
15 rows selected.
SQL>
看看有沒有幫助。
添加回答
舉報