Oracle APEX 中基于用户的自定义内容
这就是我处理 OP 实施和结果演示的方式。我创建了两个自定义用户帐户:“RICHARD”和“KAPLAN”。登录此演示的应用程序页面后,用户将找到一份报告以及与其帐户信息关联的自定义文本。
此示例使用 APEX 标准用户身份验证方案。这也应该适用于其他自定义授权方法。
我还添加了一个学生姓名,以便与登录名匹配(由保留的变量/项目名称标识:APP_USER)。用户登录名不必与学生名相同。其他方法可以实现,例如通过在STUDENT 表中的学生姓名、ID 和登录名之间提供一个合适的“翻译”列。
创建此页面是为了演示如何调用基于会话的项目值以及基于架构/表的引用。
用户问候
此部分是一个 HTML 区域。页面源是带有一些 HTML 标记的纯文本,也是 APP_USER 值的替换变量:
Hello There, &APP_USER. How are you today?<br>
Your student ID number is: &P12_SID. <br>
Welcome to your virtual classroom.
班级学生名单
存储在页面区域中的 REPORT 内容类型。此列表是存储在我的示例数据库中的所有学生信息的报告输出:
SELECT *
FROM STUDENT;
使用过滤条件的学生查询
隐藏页面项方法
SELECT *
FROM STUDENT
WHERE ID = :P12_SID;
这需要...
SELECT *
FROM STUDENT
WHERE NAME = :APP_USER;
在应用程序的其他地方,任何查询都需要通过STUDENT.ID 过滤的项目值,而是参考定义的页面项目:P12_SID。在此示例中,“SID”(学生 ID)值作为 HIDDEN FIELD ITEM 在页面之间传递。
通过将隐藏的类型页面项分配给查询操作,这些分配的数据值可以在整个页面内容中重复使用。为隐藏页面项目启用PROTECTED FIELD 设置还可以防止用户通过欺骗其他学生 ID 值来访问其他学生的记录。
使用 PL/SQL 函数限制用户访问
您现在已经看到应用程序登录值访问的STUDENT.NAME 和STUDENT.ID 值。
报名确认页面
下表用于开发此报告的输出。这些其他支持表来自另一个 Stack Overflow 帖子,其结构和要求非常相似。这个架构可以是课堂作业的一部分吗?
架构 DDL 源代码
STUDENT_ENROLLMENT:此表包含将STUDENT 记录连接到CLASS 记录的多个id 值的关联。
CREATE TABLE "STUDENT_ENROLLMENT"
( "CONFIRMATION_ID" NUMBER(10,0) NOT NULL ENABLE,
"STUDENT_ID" NUMBER(10,0) NOT NULL ENABLE,
"CLASS_ID" NUMBER(10,0) NOT NULL ENABLE,
"ENROLL_DATE" DATE NOT NULL ENABLE,
"SEMESTER_ID" NUMBER(10,0) NOT NULL ENABLE,
CONSTRAINT "STUDENT_ENROLLMENT_PK" PRIMARY KEY ("CONFIRMATION_ID") ENABLE
)
/
ALTER TABLE "STUDENT_ENROLLMENT" ADD CONSTRAINT "STUDENT_ENROLLMENT_FK"
FOREIGN KEY ("STUDENT_ID")
REFERENCES "STUDENT" ("ID") ENABLE
/
ALTER TABLE "STUDENT_ENROLLMENT" ADD CONSTRAINT "STUDENT_ENROLLMENT_FK2"
FOREIGN KEY ("CLASS_ID")
REFERENCES "CLASS" ("ID") ENABLE
/
ALTER TABLE "STUDENT_ENROLLMENT" ADD CONSTRAINT "STUDENT_ENROLLMENT_FK3"
FOREIGN KEY ("SEMESTER_ID")
REFERENCES "SEMESTER" ("ID") ENABLE
/
SEMESTER_SUBJECT:此表连接给定的班级季节和提供的科目
CREATE TABLE "SEMESTER_SUBJECT"
( "ID" NUMBER NOT NULL ENABLE,
"SEMESTER_ID" NUMBER NOT NULL ENABLE,
"SUBJECT_ID" NUMBER NOT NULL ENABLE,
PRIMARY KEY ("ID") ENABLE,
CONSTRAINT "SEM_SUB_UQ" UNIQUE ("SEMESTER_ID", "SUBJECT_ID") ENABLE
)
/
ALTER TABLE "SEMESTER_SUBJECT" ADD FOREIGN KEY ("SEMESTER_ID")
REFERENCES "SEMESTER" ("ID") ENABLE
/
ALTER TABLE "SEMESTER_SUBJECT" ADD FOREIGN KEY ("SUBJECT_ID")
REFERENCES "SUBJECT" ("ID") ENABLE
/
CLASS:此表包含有关每个学期提供的课程(按学科组织)的信息。
CREATE TABLE "CLASS"
( "ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(40) NOT NULL ENABLE,
"SEMESTER_SUBJECT_ID" NUMBER NOT NULL ENABLE,
PRIMARY KEY ("ID") ENABLE
)
/
ALTER TABLE "CLASS" ADD FOREIGN KEY ("SEMESTER_SUBJECT_ID")
REFERENCES "SEMESTER_SUBJECT" ("ID") ENABLE
/
SEMESTER:这是一个小维度领域。学年和学年的组合名称解析为唯一的 id 值。为了帮助在值查询列表中可能使用这些值,包含一个 SORT_ID 值,因为这些值的正确顺序不是字母数字。
CREATE TABLE "SEMESTER"
( "ID" NUMBER NOT NULL ENABLE,
"SORT_ID" NUMBER,
"NAME" VARCHAR2(20) NOT NULL ENABLE,
PRIMARY KEY ("ID") ENABLE
)
/
用户自定义注册报告的示例输出
这是用户/学生 RICHARD 的输出演示
这是用户/学生 KAPLAN 的输出演示
用于定义注册报告的 SQL 查询
select STUDENT.NAME as "STUDENT NAME",
STUDENT_ENROLLMENT.CONFIRMATION_ID as "CONF ID",
SEMESTER.NAME as "SEMESTER YEAR",
SUBJECT.SUBJECT_NAME as SUBJECT,
CLASS.NAME as "CLASS NAME",
STUDENT_ENROLLMENT.ENROLL_DATE as "ENROLL DATE"
from SUBJECT SUBJECT,
CLASS CLASS,
SEMESTER_SUBJECT SEMESTER_SUBJECT,
SEMESTER SEMESTER,
STUDENT STUDENT,
STUDENT_ENROLLMENT STUDENT_ENROLLMENT
where SEMESTER_SUBJECT.SEMESTER_ID = SEMESTER.ID
and SEMESTER_SUBJECT.SUBJECT_ID = SUBJECT.ID
and SEMESTER_SUBJECT.ID = CLASS.SEMESTER_SUBJECT_ID
and STUDENT_ENROLLMENT.SEMESTER_ID = SEMESTER_SUBJECT.SEMESTER_ID
and STUDENT_ENROLLMENT.CLASS_ID = CLASS.ID
and STUDENT_ENROLLMENT.STUDENT_ID = STUDENT.ID
and STUDENT_ENROLLMENT.STUDENT_ID = :P2_SID
注意:“学生 ID”参数P2_SID 由与 P12(演示起始页)上的导航按钮关联的重定向命令填充。 P2_SID 也是一个隐藏的、受保护的页面项。
将起始页连接到注册报告
使用导航链接,最好是 BUTTON 类型(但没关系)。
- 选择以下操作:“重定向”到注册报告申请中的页面。
- 将
STUDENT_ID 的TARGET 页面项设置为在START 页面中派生的STUDENT_ID 项设置的值。请记住,会话属性APP_USER 和页面项STUDENT_ID 并不相同,但它们的关系由应用程序认证方案的设置方式以及STUDENT 信息表的结构定义。
结束评论
目前尚不清楚基于非用户可选值自定义用户体验的尝试。尽管如此,从一般意义上讲这个解决方案仍然是 APEX 设计和功能的有用指南。
如果涉及查询及其通过报表页面的呈现,开发人员可以直接或通过使用“页面项”将会话属性(例如“用户名”)应用到报表 SQL 查询定义中.
如果需要在应用程序的其他地方使用这些参数,“区域按钮”等导航元素可以将派生参数从一个页面传输到下一个页面。