我在Oracle Apex中开发的系统有问题

问题描述 投票:-1回答:1

我正在使用Oracle Apex为大学开发在线考试系统,我已经开发了系统的大部分内容,并且在向学生展示考试时遇到了问题,考试部分中使用的表:-测试-问题

-答案

这是表之间关系的图片

The image

我需要显示问题表中的问题,它下面是四个选项,首选,第二选择,依此类推...选择之后,我需要将学生做出的选择与答案时间表中的答案进行比较。此过程重复五次,这是每次考试的总题数。然后显示结果。非常感谢。

sql oracle oracle-sqldeveloper oracle-apex plsqldeveloper
1个回答
0
投票

与编程中的所有事物一样,根据需求可以采取许多不同的方法。鉴于我们到目前为止已讨论的内容,我将向您介绍一种方法。

给出以下表格和数据:

create table test (
    id    number generated by default on null as identity  
          constraint test_id_pk primary key,
    name  varchar2(255)
);

create table question (
    id         number generated by default on null as identity  
              constraint question_id_pk primary key,
    test_id    number
              constraint question_test_id_fk
              references test on delete cascade,
    question   varchar2(4000),
    ch1        varchar2(4000),
    ch2        varchar2(4000),
    ch3        varchar2(4000),
    ch4        varchar2(4000),
    correct_ch number constraint question_correct_ch_cc
              check (correct_ch in (1,2,3,4))
);

declare

  l_id number;

begin

  insert into test (name) values ('Math') returning id into l_id;

  insert into question (
    test_id,
    question,
    ch1,
    ch2,
    ch3,
    ch4,
    correct_ch
  ) values (
    l_id,
    'What is 1+2?',
    '3',
    '2',
    '4',
    '1',
    1
  );

  insert into question (
    test_id,
    question,
    ch1,
    ch2,
    ch3,
    ch4,
    correct_ch
  ) values (
    l_id,
    'What is 10*0?',
    '10',
    '0',
    '1',
    '100',
    2
  );

  insert into test (name) values ('Science') returning id into l_id;

  insert into question (
    test_id,
    question,
    ch1,
    ch2,
    ch3,
    ch4,
    correct_ch
  ) values (
    l_id,
    'How many planets are there?',
    '10',
    '7',
    '9',
    '8',
    4
  );

  insert into question (
    test_id,
    question,
    ch1,
    ch2,
    ch3,
    ch4,
    correct_ch
  ) values (
    l_id,
    ' What is the biggest planet in our solar system?',
    'Jupiter',
    'Earth',
    'Mars',
    'Pluto',
    1
  );

end;
/

以下应该起作用:

  1. 创建一个新的空白页。将名称设置为测试。我的页码默认为29,您可能需要在下面进行调整。
  2. 向页面添加新区域。将标题设置为测试,将类型设置为经典报告,将表名称设置为测试
  3. 区域下,右键单击
  4. 列,然后选择创建虚拟列。单击目标未定义链接按钮。将Page设置为比当前页面高一个(对我来说是30)。在“设置项目”下,将P30_TEST_ID放在同一行的“ 名称”列中,将“ &ID。”放入同一行的“ ”列中。将清除缓存设置为30,然后单击确定。将链接文本(在目标下)设置为进行测试。如果您运行该页面,则应该看到测试报告,并带有指向该测试页面的链接(无法正常使用)。
  5. 返回到构建器并创建另一个空白页。 页码应该比上一页高一个(对我来说是30)。将
  6. 名称
  7. 设置为问题向页面添加新区域。将标题设置为
  8. 回答以下问题
  9. 向该区域添加新项目。将名称设置为
  10. P30_TEST_ID
  11. ,将类型设置为隐藏[将另一个项目添加到该区域。将名称设置为
  12. P30_QUESTION_ID
  13. ,将类型设置为隐藏[将另一个项目添加到该区域。将名称设置为
  14. 问题
  15. ,将类型设置为仅显示将另一个项目添加到该区域。将
  16. 名称
  17. 设置为

    P30_CHOICES

    ,将类型设置为无线电组。在值列表下,将类型设置为SQL查询,然后将以下内容复制粘贴到SQL查询字段中:select val d, choice_num r from question unpivot (val for choice_num in (ch1 as '1', ch2 as '2', ch3 as '3', ch4 as '4')) where test_id = :P30_TEST_ID and id = :P30_QUESTION_ID 禁用
    显示额外值

    显示空值

    在SQL查询字段下。此取消透视将把列变成行,因此可以与Radio Group一起使用。用户将看到选择的文本,但将返回选择编号(1-4)。

  18. Pre-Rendering
  19. 下右键单击

    Header前

    ,然后选择创建过程。将Name设置为Init page,然后将以下代码复制粘贴到PL / SQL Code字段中。declare l_question_rec question%rowtype; begin if :P30_QUESTION_ID is null then select id into :P30_QUESTION_ID from question where test_id = :P30_TEST_ID order by id fetch first 1 row only; end if; select * into l_question_rec from question where id = :P30_QUESTION_ID; :P30_QUESTION := l_question_rec.question; :P30_CHOICES := null; end; 向该区域添加按钮。将
    按钮名称
    设置为
  20. NEXT_QUESTION
  21. 在处理选项卡下,右键单击
  22. 处理
  23. ,然后选择

    创建处理

    。将名称设置为选择下一个问题,然后将以下代码复制粘贴到“ PL / SQL代码”字段中:select id into :P30_QUESTION_ID from question where test_id = :P30_TEST_ID and id > :P30_QUESTION_ID order by id fetch first 1 row only;
    此时,如果返回上一页并运行它,则应该能够选择一个测试并查看第一个问题。您还应该能够从可用选项中进行选择,并使用“下一个问题”按钮查看下一个问题。
  24. enter image description here

这是一个最小的可行示例。到目前为止,我还没有为您提供验证答案的方法-尽管您愿意,我也可以提供答案。我建议您首先使用在此描述的技术进行尝试:Alert message after submit and validation page in oracle apex

我还没有考虑很多其他事情:安全性,当您遇到最后一个问题时不显示下一个问题按钮,等等。我没有做任何事情,因为我只是想让您了解事物如何运作。当然,您会需要根据自己的需求进行调整。

最后,经过一番尝试之后,我可能会为选择/答案添加第三张表-尽管它不能像您之前定义的那样起作用。它只会将答案存储在行中,而不是列中,这使得它们在关系上更容易使用(例如,无需枢轴旋转)。

© www.soinside.com 2019 - 2024. All rights reserved.