Oracle 甲骨文顶点19。如何从3个表中创建具有交互式报告的表单?

Oracle 甲骨文顶点19。如何从3个表中创建具有交互式报告的表单?,oracle,oracle-apex,oracle-apex-19.1,Oracle,Oracle Apex,Oracle Apex 19.1,我写了一个内部连接语句。显示了一个表,但我无法从中编辑全名 输入表 我的问题是。。。我应该如何创建一个可以编辑所有表字段的复杂表单 请给我任何提示,否则我会发疯的:( 我尝试创建一个视图: 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 O

我写了一个内部连接语句。显示了一个表,但我无法从中编辑全名 输入表

我的问题是。。。我应该如何创建一个可以编辑所有表字段的复杂表单

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

我尝试创建一个视图:

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语句中更新了值:)

但当我添加一个带有表的表单时,apex仍然无法更新值

错误:

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

一个选项是根据您编写的
select
语句创建视图。然后创建一个
而不是
触发器,该触发器将关注什么会发生在哪里。所有这些都将在数据库内完成;Apex将仅用于显示值(IR)和将数据“传输”到视图(表单),而instead of触发器将数据移动到适当的表中


如何创建替代触发器?使用
创建触发器
。例如,根据Scott的模式:

这是一种观点:

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>

感谢您的回答:)如何创建而不是触发器?不客气。我编辑了我的答案并添加了一些代码;请看一看。我试图创建一个视图,但它不起作用。我应该创建一个只包含2个表还是3个表的视图@Littlefoot您能帮助我吗:)视图只是一个存储查询,它可以包含任意多个表。您知道我的视图状态有什么问题吗?我编辑了我的问题