Oracle Apex 19. 如何从 3 个表创建带有交互式报告的表单?
Oracle Apex 19. How to create form with interactive report from 3 tables?
我写了一个内部连接语句。 table 已显示,但我无法编辑 FULL NAME from
EMPLOYEES_IMPORTtable
我的问题是...我应该如何创建一个可以编辑所有 table 字段的有吸引力的表单?
请给我任何提示,否则我会发疯的:(
我尝试创建一个视图:
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 语句中我可以更新值:)
但是当我添加一个带有 table 的表单时,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
语句创建一个 view。然后创建一个 INSTEAD OF
触发器,它会处理什么去哪里。所有这些都将在数据库中完成; Apex 将仅用于将值 (IR) 和 "transfer" 数据显示到视图(表单),而 而不是 触发器会将数据移动到适当的表中。
如何创建 instead of 触发器?使用 CREATE TRIGGER
。例如,基于 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>
我写了一个内部连接语句。 table 已显示,但我无法编辑 FULL NAME from EMPLOYEES_IMPORTtable
我的问题是...我应该如何创建一个可以编辑所有 table 字段的有吸引力的表单?
请给我任何提示,否则我会发疯的:(
我尝试创建一个视图:
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 语句中我可以更新值:)
但是当我添加一个带有 table 的表单时,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
语句创建一个 view。然后创建一个 INSTEAD OF
触发器,它会处理什么去哪里。所有这些都将在数据库中完成; Apex 将仅用于将值 (IR) 和 "transfer" 数据显示到视图(表单),而 而不是 触发器会将数据移动到适当的表中。
如何创建 instead of 触发器?使用 CREATE TRIGGER
。例如,基于 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>