【问题标题】:Oracle Application Express - Forms And QueriesOracle Application Express - 表单和查询
【发布时间】:2014-04-02 23:36:42
【问题描述】:

我正在使用应用程序构建器在 Oracle Application Express (Apex) 中创建一个数据库应用程序,我有一个关于表单和报告的快速问题。我知道如何创建基本表单和报告,但我的目标是做一些更棘手的事情。我基本上希望向用户呈现一个包含用户名和密码字段的表单,在输入用户名和密码后,我希望表单交叉检查我使用 SQL 创建的“学生”表输入的用户名和密码,如果它存在,然后我希望应用程序显示包含此数据的相关字段的报告。

例如,用户通过表单输入“hello”作为他们的用户名和“letmein”作为密码,然后如果它存在于学生表中,则应用程序将允许他们查看特定学生的整行数据仅限帐户。我想这样做的原因是我希望学生只能看到他们的特定数据行,而不是显然由于隐私原因而插入“学生”表中的任何其他学生行。

在为应用程序创建新页面时,我尝试使用表单查询选项,但它只允许我作为开发人员输入查询语句,我不能这样做,因为它必须是唯一的用户输入在表单本身的“用户名”和“密码”字段中。

希望这是有道理的,因为我试图以最好的方式进行解释,老实说,我一直在寻找好几个小时试图找到解决方案,但我觉得他们在 YouTube 等网站上提供的 Oracle Application Express 材料有限我通常总是在学习新事物时参考。我还查看了 Oracle Application Express 用户文档,但我找不到它们可以帮助我实现我正在寻找的结果。

【问题讨论】:

  • 您确定不想创建一个登录页面,然后创建一个使用当前用户作为过滤器的报告吗?
  • 我已经设置了一个基本的登录页面,但是我如何按照你所说的通过报告过滤用户?

标签: sql oracle oracle-apex


【解决方案1】:

如果您已经有一个用户正在输入其用户名和密码的登录页面,则应在应用程序会话中填充 APP_USER 值。因此,您的报告可以是

SELECT *
  FROM student
 WHERE username = :APP_USER

APEX 将自动绑定当前登录的用户。

【讨论】:

  • 我尝试将其用作报告查询,它只是在报告运行时显示未找到数据。有任何想法吗? Student 表工作正常,因为我能够通过已插入的用户名和密码字段登录,但为什么此查询不起作用
  • @user3417643,发布您的查询。
  • 好的,这里是:SELECT * FROM STUDENT WHERE USERNAME = :APP_USER
  • @user3417643 那么在登录屏幕上输入的用户名是什么,学生表的用户名列中的数据是什么,这两者是否匹配?
  • 我正在使用的登录屏幕上的一个用户名示例是“student1”,它与学生表正确匹配。另请注意,我目前正在使用自定义身份验证,该身份验证根据学生表检查学生用户名和密码,并且它确实有效,因为我尝试在表上填充多个用户的情况下登录。可能是因为我正在使用自定义身份验证,这就是 :APP_USER 功能无法正常工作的原因吗?
【解决方案2】:

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.NAMESTUDENT.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 类型(但没关系)。

  1. 选择以下操作:“重定向”到注册报告申请中的页面。
  2. STUDENT_ID 的TARGET 页面项设置为在START 页面中派生的STUDENT_ID 项设置的值。请记住,会话属性APP_USER 和页面项STUDENT_ID 并不相同,但它们的关系由应用程序认证方案的设置方式以及STUDENT 信息表的结构定义。

结束评论

目前尚不清楚基于非用户可选值自定义用户体验的尝试。尽管如此,从一般意义上讲这个解决方案仍然是 APEX 设计和功能的有用指南。

如果涉及查询及其通过报表页面的呈现,开发人员可以直接或通过使用“页面项”将会话属性(例如“用户名”)应用到报表 SQL 查询定义中.

如果需要在应用程序的其他地方使用这些参数,“区域按钮”等导航元素可以将派生参数从一个页面传输到下一个页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2012-12-02
    • 2011-03-11
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多