温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Oracle Apex 19. How to create form with interactive report from 3 tables?
oracle oracle-apex oracle-apex-19.1

其他 - Oracle Apex 19.如何使用来自3个表的交互式报表创建表单?

发布于 2020-04-07 11:45:08

我写了一个内部加入声明。表格已用尽,但我无法编辑EMPLOYEES_IMPORT表格中的全名

我的问题是...我应该如何创建一个吸引人的表格来编辑所有表格字段?

请给我任何提示,否则我会发疯的:(

我想创建一个视图:

CREATE VIEW STAMP_TEST AS
SELECT s.STAMP_ID ,
       s.PERSON_ID ,
       hp.FULL_NAME,
       h.DESCRIPTION
FROM STAMPS s
INNER JOIN EMPLOYEES_IMPORT hp ON s.PERSON_ID = hp.PERSON_ID
INNER JOIN DEPARTMENTS_IMPORT h ON hp.ORGANIZATION_ID = h.ORGANIZATION_ID

我想我不理解示例中的触发函数,因为我收到了一个错误:

create or replace trigger trg_ed_seal_stamps
      instead of insert or update
      on STAMP_TEST
      for each row
    begin
      if inserting then
         insert into STAMPS (STAMP_ID, START_DT)
           values (:new.SEAL_STAMP_ID, :new.START_DT);
         insert into EMPLOYEES_IMPORT (FULL_NAME)
          values (:new.FULL_NAME);
         insert into DEPARTMENTS_IMPORT (DESCRIPTION)
           values (:new.DESCRIPTION);
     elsif updating then
        update STAMPS set
          STAMP_ID = :new.STAMP_ID
          where PERSON_ID = :new.PERSON_ID;
        update EMPLOYEES_IMPORT set
          FULL_NAME = :new.FULL_NAME
          where PERSON_ID = :new.PERSON_ID;
        update HDEPARTMENTS_IMPORT set
          DESCRIPTION = :new.DESCRIPTION
          where ORGANIZATION_ID = :new.ORGANIZATION_ID;
     end if;
   end;
  /

所以我设法创建触发器,并在sql语句中可以更新值:)

但是当我添加带有表格的表格时,顶点仍然无法更新值

错误:

ORA-22816: unsupported feature with RETURNING clause

细节:

is_internal_error: false
component.type: APEX_APPLICATION_PAGE_PROCESS
component.id: 14401759410321665
component.name: Process form sds
error_backtrace:
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x4255f33438       971  package body APEX_190100.WWV_FLOW_ERROR.INTERNAL_GET_ERROR
0x4255f33438      1039  package body APEX_190100.WWV_FLOW_ERROR.INTERNAL_ADD_ERROR
0x4255f33438      1092  package body APEX_190100.WWV_FLOW_ERROR.ADD_ERROR
0x40ffd4e4b0       593  package body APEX_190100.WWV_FLOW_PROCESS.ADD_ERROR_MESSAGE
0x4738108530       547  package body APEX_190100.WWV_FLOW_FORM_REGION.RAISE_ERROR_MESSAGE
0x4738108530      1185  package body APEX_190100.WWV_FLOW_FORM_REGION.DML_PROCESS_INT
0x4738108530      2198  package body APEX_190100.WWV_FLOW_FORM_REGION.DML_PROCESS
0x44b06ce5e8      1246  package body APEX_190100.WWV_FLOW_PROCESS_NATIVE.EXECUTE_PROCESS
0x448c6bff28      2473  package body APEX_190100.WWV_FLOW_PLUGIN.EXECUTE_PROCESS
0x40ffd4e4b0       203  package body APEX_190100.WWV_FLOW_PROCESS.PERFORM_PROCESS
0x40ffd4e4b0       450  package body APEX_190100.WWV_FLOW_PROCESS.PERFORM
0x472c9ca568      5726  package body APEX_190100.WWV_FLOW.ACCEPT
0x44b175fb00         2  anonymous block

查看更多

提问者
Anna K
被浏览
86
Littlefoot 2020-02-03 03:32

一种选择是基于您编写的语句创建视图select然后创建一个INSTEAD OF触发器,触发器将注意发生在哪里。所有这些将在数据库内完成;Apex将仅用于显示值(IR)并将数据“传输”到视图(窗体),而使用触发器代替触发器将数据移动到适当的表中。


如何创建一个代替触发器?使用CREATE TRIGGER例如,基于斯科特的模式:

这是一个视图:

SQL> create or replace view v_emp_dept as
  2  select d.deptno, d.dname, e.empno, e.ename, e.job, e.sal
  3  from emp e join dept d on e.deptno = d.deptno;

View created.

SQL> select * From v_emp_Dept;

    DEPTNO DNAME               EMPNO ENAME      JOB              SAL
---------- -------------- ---------- ---------- --------- ----------
        20 RESEARCH             7369 SMITH      CLERK            800
        30 SALES                7499 ALLEN      SALESMAN        1600
        30 SALES                7521 WARD       SALESMAN        1250
        20 RESEARCH             7566 JONES      MANAGER         2975
        30 SALES                7654 MARTIN     SALESMAN        1250
        30 SALES                7698 BLAKE      MANAGER         2850
        10 ACCOUNTING           7782 CLARK      MANAGER         2450
        20 RESEARCH             7788 SCOTT      ANALYST         3000
        10 ACCOUNTING           7839 KING       PRESIDENT       5000
        30 SALES                7844 TURNER     SALESMAN        1500
        20 RESEARCH             7876 ADAMS      CLERK           1100
        30 SALES                7900 JAMES      CLERK            950
        20 RESEARCH             7902 FORD       ANALYST         3000
        10 ACCOUNTING           7934 MILLER     CLERK           1300

14 rows selected.

SQL>

代替触发器可能看起来像这样:

SQL> create or replace trigger trg_ed
  2    instead of insert or update
  3    on v_emp_dept
  4    for each row
  5  begin
  6    if inserting then
  7       insert into dept (deptno, dname)
  8         values (:new.deptno, :new.dname);
  9       insert into emp (deptno, empno, ename, job, sal)
 10         values (:new.deptno, :new.empno, :new.ename, :new.job, :new.sal);
 11    elsif updating then
 12       update dept set
 13         dname = :new.dname
 14         where deptno = :new.deptno;
 15       update emp set
 16         deptno = :new.deptno,
 17         ename = :new.ename,
 18         job = :new.job,
 19         sal = :new.sal
 20         where empno = :new.empno;
 21    end if;
 22  end;
 23  /

Trigger created.

SQL>

测试:更新并插入:

SQL> update v_emp_dept set
  2    dname = 'accounting'
  3    where deptno = 10;

3 rows updated.

SQL> insert into v_emp_dept (deptno, dname, empno, ename, job, sal)
  2    values (99, 'New dept', 1, 'Littlefoot', 'Developer', 1000);

1 row created.

结果:

SQL> select * From dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        99 New dept                              --> new row
        10 accounting     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> select * From emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
         1 Littlefoot Developer                           1000                    99 --> new row
      7369 SMITH      CLERK           7902 17.12.80        800                    20
      7499 ALLEN      SALESMAN        7698 20.02.81       1600        300         30
      7521 WARD       SALESMAN        7698 22.02.81       1250        500         30
      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                    30
      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

15 rows selected.

SQL>