Oracle Forms 10g项目:已选科目从LOV过滤的SQL问题求助
Oracle Forms 10g LOV排除已选科目问题解决
首先你写的SQL存在语法错误:not in后面的括号未闭合,而且逻辑仅排除了当前行的subject_id,无法实现排除该班级所有已选科目的需求。以下是针对不同场景的正确解决方案:
场景1:已选科目已保存到数据库表
假设你有一个关联表(例如class_subjects)存储班级与科目的绑定关系(字段:class_id、subject_id),LOV的SQL应修改为:
select subject_name, subject_id from subject where subject_id not in ( select subject_id from class_subjects where class_id = :class_info.CLASS_ID -- 替换为你表单中班级ID的字段名 )
如果subject_id可能存在NULL值,推荐用NOT EXISTS替代NOT IN(避免NULL导致的查询异常):
select s.subject_name, s.subject_id from subject s where not exists ( select 1 from class_subjects cs where cs.class_id = :class_info.CLASS_ID and cs.subject_id = s.subject_id )
场景2:已选科目仅在表单块中(未保存到数据库)
如果科目是在class_info块中新增的多行记录(尚未提交到数据库),需要排除块内所有已输入的subject_id,可以直接查询表单块数据:
select s.subject_name, s.subject_id from subject s where not exists ( select 1 from class_info ci where ci.class_id = :class_info.CLASS_ID -- 限定为当前班级 and ci.subject_id = s.subject_id and ci.subject_id is not null -- 排除空行 )
额外注意事项
- 确保
class_info块的class_id字段已有值,否则无法区分不同班级的已选科目; - 调用LOV前可执行
GO_BLOCK('class_info')确保块处于激活状态,避免字段引用异常; - 若表单支持多行输入,需确保块的
Multi Record属性已设置为Yes。
内容的提问来源于stack exchange,提问作者X4r3X
相关产品推荐
相关产品推荐

