Oracle Apex新手求助:语言测试应用的相等性与计数函数开发
嘿,作为刚接触Oracle Apex的新手,能想到搭建这样的语言测试应用已经超棒啦!我来一步步帮你实现需要的相等性校验和计数功能,咱们分模块捋清楚:
一、随机获取Table1的Korean字段作为Question
你需要在页面加载时自动从Table1里随机挑一条Korean值作为题目,这可以通过页面的Before Header或Before Regions事件来实现:
- 先在页面上创建一个页面项(比如命名为
P1_QUESTION),类型设为“文本字段”并勾选“只读”,用来展示随机题目。 - 给页面添加一个PL/SQL过程类型的页面处理,触发时机选“Before Header”,代码如下:
SELECT Korean INTO :P1_QUESTION FROM (SELECT Korean FROM Table1 ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM = 1;
- 如果希望用户提交答案后自动换题,可以在提交按钮的“提交后分支”里,再执行一次这段PL/SQL代码。
二、相等性校验与Score字段计算
核心逻辑是:把用户输入的Answer和Table1中对应Korean的English值比对,匹配的话Score设为1,不匹配设为0,再把数据存入Table2。
步骤1:添加校验与计算的PL/SQL处理
在提交按钮的Processing阶段,新增一个PL/SQL过程,代码如下:
DECLARE v_target_english Table1.English%TYPE; BEGIN -- 根据当前题目(Korean)找到对应的正确English答案 SELECT English INTO v_target_english FROM Table1 WHERE Korean = :P1_QUESTION; -- 忽略大小写的相等性校验,计算Score IF UPPER(:P1_ANSWER) = UPPER(v_target_english) THEN :P1_SCORE := 1; ELSE :P1_SCORE := 0; END IF; -- 异常处理:防止找不到对应题目时报错 EXCEPTION WHEN NO_DATA_FOUND THEN apex_error.add_error ( p_message => '无法匹配到题目对应的答案,请重试', p_display_location => apex_error.c_inline_in_notification ); END;
提示:用UPPER()是为了让校验忽略大小写,如果你需要严格区分大小写,去掉这个函数即可。
步骤2:将数据插入Table2
同样在Processing阶段,新增一个SQL插入语句,把用户输入的日期、题目、答案和计算出的分数存入Table2:
-- 注意:Date是Oracle的关键字,建议把字段名改成Test_Date;如果不能改,要用双引号包裹 INSERT INTO Table2 ("Date", Question, Answer, Score) VALUES (:P1_DATE, :P1_QUESTION, :P1_ANSWER, :P1_SCORE); COMMIT;
三、实现计数统计功能
如果需要统计用户的答题总数、答对次数等,可以在页面上添加统计项(比如P1_TOTAL_ATTEMPTS、P1_TOTAL_CORRECT),然后在提交后更新这些值:
- 创建两个只读的页面项,分别用来展示总答题数和答对数。
- 在提交按钮的Processing阶段,新增一个PL/SQL过程来计算统计值:
BEGIN -- 统计当日总答题数(如果需要按用户统计,可添加用户ID过滤条件) SELECT COUNT(*) INTO :P1_TOTAL_ATTEMPTS FROM Table2 WHERE "Date" = :P1_DATE; -- 统计当日答对次数 SELECT COUNT(*) INTO :P1_TOTAL_CORRECT FROM Table2 WHERE "Date" = :P1_DATE AND Score = 1; END;
然后把这两个统计项放到页面合适的位置,用户提交后就能看到实时统计了。
四、新手友好小提示
- 页面项设置:
P1_DATE用“日期选择器”类型,P1_ANSWER用普通文本字段,P1_SCORE可以设为隐藏或只读展示。 - 重复题目问题:如果不想重复出现已经考过的题目,可以在随机查询时排除Table2中已有的Question,比如:
SELECT Korean INTO :P1_QUESTION FROM (SELECT Korean FROM Table1 WHERE Korean NOT IN (SELECT Question FROM Table2 WHERE "Date" = :P1_DATE) ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM = 1;
- 测试时可以开启Apex的调试模式,方便排查代码问题。
内容的提问来源于stack exchange,提问作者Adam Grant
相关产品推荐
相关产品推荐

