我正在使用Oracle Apex为大学开发在线考试系统,我已经开发了系统的大部分内容,并且在向学生展示考试时遇到了问题,考试部分中使用的表:-测试-问题
这是表之间关系的图片
我需要显示问题表中的问题,它下面是四个选项,首选,第二选择,依此类推...选择之后,我需要将学生做出的选择与答案时间表中的答案进行比较。此过程重复五次,这是每次考试的总题数。然后显示结果。非常感谢。
与编程中的所有事物一样,根据需求可以采取许多不同的方法。鉴于我们到目前为止已讨论的内容,我将向您介绍一种方法。
给出以下表格和数据:
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;
/
以下应该起作用:
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)。在
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;
向该区域添加按钮。将按钮名称设置为
创建处理
。将名称设置为选择下一个问题,然后将以下代码复制粘贴到“ 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;
此时,如果返回上一页并运行它,则应该能够选择一个测试并查看第一个问题。您还应该能够从可用选项中进行选择,并使用“下一个问题”按钮查看下一个问题。
这是一个最小的可行示例。到目前为止,我还没有为您提供验证答案的方法-尽管您愿意,我也可以提供答案。我建议您首先使用在此描述的技术进行尝试:Alert message after submit and validation page in oracle apex
我还没有考虑很多其他事情:安全性,当您遇到最后一个问题时不显示下一个问题按钮,等等。我没有做任何事情,因为我只是想让您了解事物如何运作。当然,您会需要根据自己的需求进行调整。
最后,经过一番尝试之后,我可能会为选择/答案添加第三张表-尽管它不能像您之前定义的那样起作用。它只会将答案存储在行中,而不是列中,这使得它们在关系上更容易使用(例如,无需枢轴旋转)。