You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex新手求助:语言测试应用的相等性与计数函数开发

嘿,作为刚接触Oracle Apex的新手,能想到搭建这样的语言测试应用已经超棒啦!我来一步步帮你实现需要的相等性校验和计数功能,咱们分模块捋清楚:

一、随机获取Table1的Korean字段作为Question

你需要在页面加载时自动从Table1里随机挑一条Korean值作为题目,这可以通过页面的Before Header或Before Regions事件来实现:

  1. 先在页面上创建一个页面项(比如命名为P1_QUESTION),类型设为“文本字段”并勾选“只读”,用来展示随机题目。
  2. 给页面添加一个PL/SQL过程类型的页面处理,触发时机选“Before Header”,代码如下:
SELECT Korean INTO :P1_QUESTION
FROM (SELECT Korean FROM Table1 ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM = 1;
  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),然后在提交后更新这些值:

  1. 创建两个只读的页面项,分别用来展示总答题数和答对数。
  2. 在提交按钮的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:26:57