提问人:Shuvasish Dolui 提问时间:11/3/2023 更新时间:11/3/2023 访问量:55
在oracle apex中,当我修改具有联合查询的交互式网格中的数据时,它给了我ORA-02014错误。如何处理此错误?
In oracle apex, when I modify the data in interactive grid which has a union query, it gives me ORA-02014 error. How to handle this error?
问:
当我尝试修改交互式网格列时,它给出了 ORA-02014 错误。
在后端,我使用了带有联合的sql查询,并且还使用join连接了3个表。
我在过去几天尝试过,我希望有人可能会有解决方案。
答:
0赞
Littlefoot
11/3/2023
#1
除了我要建议的选项之外,可能还有其他选项 - 例如
重写查询,以便不联接表,而是通过函数获取查找值,然后将这些列设置为只读,以便更新不会影响它们,或者
您可以使用以下设置(在 Apex 中)创建自己的进程,例如此进程(有关更多示例代码,请参阅“帮助”):
我更喜欢创建一个视图,而不是处理更新的触发器。
下面是一个示例;看看是否有帮助。
联接一些表并包含的视图(这就是您描述的):union
SQL> create or replace view v_emp_dept as
2 select distinct d.deptno, d.dname, e.empno, e.ename, e.job
3 from emp e join dept d on e.deptno = d.deptno
4 where e.deptno = 10
5 union all
6 select distinct d.deptno, d.dname, e.empno, e.ename, e.job
7 from emp e join dept d on e.deptno = d.deptno
8 where e.deptno = 20;
View created.
这是一行:
SQL> select * from v_emp_dept where empno = 7369;
DEPTNO DNAME EMPNO ENAME JOB
---------- -------------- ---------- ---------- ---------
20 RESEARCH 7369 SMITH CLERK
如果我们尝试更新它会发生什么?失败(但不是你的错误,而是 - 它失败了):
SQL> update v_emp_dept set deptno = 10 where empno = 7369;
update v_emp_dept set deptno = 10 where empno = 7369
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
代替触发器:
SQL> create or replace trigger trg_ed
2 instead of update
3 on v_emp_dept
4 begin
5 update emp e set
6 e.deptno = :new.deptno
7 where e.empno = :new.empno;
8 end;
9 /
Trigger created.
重新运行相同的语句:update
SQL> update v_emp_dept set deptno = 10 where empno = 7369;
1 row updated.
右;现在它可以工作并更新值 - 不是在视图中(它只是反映该更改),而是在基础表中:
SQL> select * from v_emp_dept where empno = 7369;
DEPTNO DNAME EMPNO ENAME JOB
---------- -------------- ---------- ---------- ---------
10 ACCOUNTING 7369 SMITH CLERK
SQL> select deptno from emp where empno = 7369;
DEPTNO
----------
10
SQL>
评论
0赞
Shuvasish Dolui
11/3/2023
实际上,当我在查询中使用联合时,只有它给我这个错误,否则它工作正常。
0赞
Koen Lostrie
11/3/2023
#2
错误几乎说明了一切。数据库引擎无法确定如何更新 select 查询中的数据。当交互式网格被渲染时,它将尝试执行 .在您的情况下,添加联合时此语句出错。这就是引擎盖下发生的事情:SELECT * FROM (<the IG query>) FOR UPDATE
没有联合的查询工作正常:
select * from (
select * from emp where ename = 'KING'
) for update;
无法选择具有联合作品的查询进行更新:
select * from (
select * from emp where ename = 'KING'
union all
select * from emp where ename = 'BLAKE'
) for update;
Error at line 1/15: ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
@Littlefoot提到的任何解决方案都可以奏效。
评论
0赞
Shuvasish Dolui
11/3/2023
你能用PL / SQL代码详细说明第一个解决方案吗
0赞
Koen Lostrie
11/3/2023
@LIttlefoots答案中有一个例子 - 有什么不清楚的?网上有很多例子,这里有一个堆栈溢出的例子。
0赞
Shuvasish Dolui
11/3/2023
实际上使用联合我从不同的表中获取数据
0赞
Koen Lostrie
11/4/2023
我很乐意帮忙,但是......没有示例数据,也没有关于在 IG 上更新/插入/删除的预期结果的详细信息,这是不可能的。您的问题是关于 ORA-02014 错误的,您得到了 2 个非常完整的答案。现在你问了一个后续问题,只有我(而不是堆栈溢出上的其他人)被通知。我建议你发布一个新问题,其中包含一个适当的可重现案例(最好是在 emp/dept 样本数据集上 - 每个人都可以访问它),关于你看到的行为、你的期望以及你已经尝试过什么/失败的地方的详细信息。
评论