我在 Oracle Apex 中开发的系统有问题
Posted
技术标签:
【中文标题】我在 Oracle Apex 中开发的系统有问题【英文标题】:I have a problem with a system I am developing in Oracle Apex 【发布时间】:2020-02-13 15:20:01 【问题描述】:我正在使用 Oracle Apex 为大学开发一个在线考试系统, 我已经开发了系统的大部分内容,但在学生面前显示考试时出现问题, 考试部分使用的表格: - 测试 - 问题
- 回答
这是一张表之间的关系图:
我需要显示问题表中的问题,其下方是四个选项, 第一选择,第二选择,以此类推…… 选择后,我需要将学生做出的选择与答案表中的答案进行比较。 这个过程重复五次,这是每次考试的总题目。 然后显示结果。 非常感谢。
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:与编程中的所有事情一样,根据需求可以采用许多不同的方法。鉴于我们目前所讨论的内容,我将向您展示一种方法。
给定以下表格和数据:
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;
/
以下应该有效:
-
创建一个新的空白页。将 Name 设置为 Tests。我的页码默认为 29,您可能需要在下面调整页码。
向页面添加新区域。将 Title 设置为 Tests,将 Type 设置为 Classic Report,将 Table Name 设置为 测试。
右键单击Tests区域下的Columns,然后选择Create Virtual Column。点击目标的未定义链接按钮。将 Page 设置为比当前页面高 1(对我来说是 30)。在 Set Items 下,将 P30_TEST_ID 放入 Name 列,将 &ID. 放入同一行的 Value 列。将清除缓存设置为30,然后点击确定。将 Link Text(在 Target 下)设置为 Take Test。如果您运行该页面,您应该会看到包含测试页面链接的测试报告(它不会正常工作)。
返回到构建器并创建另一个空白页面。 页码应该比上一页高一个(对我来说是 30)。将 Name 设置为 Question。
向页面添加新区域。将Title设置为回答以下问题。
向区域添加新项目。将 Name 设置为 P30_TEST_ID 并将 Type 设置为 Hidden。
向该区域添加另一个项目。将 Name 设置为 P30_QUESTION_ID 并将 Type 设置为 Hidden。
向该区域添加另一个项目。将 Name 设置为 Question 并将 Type 设置为 Display Only。
向该区域添加另一个项目。将 Name 设置为 P30_CHOICES 并将 Type 设置为 Radio Group。在值列表下,将 Type 设置为 SQL Query 并将以下内容复制粘贴到 SQL Query 字段中:
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 查询字段下禁用 Display Extra Values 和 Display Null Value。
这个 unpivot 会将列转换为行,以便与 Radio Group 一起使用。用户将看到选项的文本,但将返回选项编号 (1-4)。
右击Pre-Rendering下的Before Header,然后选择Create Process。将 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;
向区域添加一个按钮。将按钮名称设置为NEXT_QUESTION。
在处理选项卡下,右键单击Processing,然后选择Create Process。将 Name 设置为 Select next question 并将以下代码复制粘贴到 PL/SQL Code 字段中:
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;
此时,如果您返回上一页并运行它,您应该可以选择一个测试并看到第一个问题。您还应该能够从可用选项中进行选择,并使用“下一个问题”按钮查看下一个问题。
这是一个最小的可行示例。到目前为止,我还没有为您提供验证答案的方法——尽管如果您愿意,我可以这样做。我建议您先使用我在此处描述的技术进行尝试:Alert message after submit and validation page in oracle apex
我也没有考虑很多其他事情:安全性,当你回答最后一个问题时不要显示下一个问题按钮等等。我没有做任何这些,因为我只是在尝试让您了解事情的运作方式。您肯定会根据自己的要求调整很多东西。
最后,在玩了一点之后,我可能会为选择/答案添加第三个表格 - 尽管它不会像您之前定义的那样工作。它只会将答案存储在行中而不是列中,这使得它们更容易以关系方式使用(例如,无需取消透视)。
【讨论】:
谢谢你,先生,我会努力的。我将需要一些补充,比如给问题增加时间,将学生执行的答案保存在分数表中,然后计算总分并在最后一个问题之后打印结果以上是关于我在 Oracle Apex 中开发的系统有问题的主要内容,如果未能解决你的问题,请参考以下文章
我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号