在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?

提问人:Shuvasish Dolui 提问时间:11/3/2023 更新时间:11/3/2023 访问量:55

问:

当我尝试修改交互式网格列时,它给出了 ORA-02014 错误。

在后端,我使用了带有联合的sql查询,并且还使用join连接了3个表。

我在过去几天尝试过,我希望有人可能会有解决方案。

oracle-apex 联合 交互式网格 ORA-02014

评论


答:

0赞 Littlefoot 11/3/2023 #1

除了我要建议的选项之外,可能还有其他选项 - 例如

  • 重写查询,以便不联接表,而是通过函数获取查找值,然后将这些列设置为只读,以便更新不会影响它们,或者

  • 您可以使用以下设置(在 Apex 中)创建自己的进程,例如此进程(有关更多示例代码,请参阅“帮助”):

    enter image description here


我更喜欢创建一个视图,而不是处理更新的触发器。

下面是一个示例;看看是否有帮助。

联接一些表并包含的视图(这就是您描述的):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 样本数据集上 - 每个人都可以访问它),关于你看到的行为、你的期望以及你已经尝试过什么/失败的地方的详细信息。