Oracle SQL插入无报错但返回0条记录,关联lookup表取值异常排查
问题根因分析
- 字段类型定义错误:
lookup_ref表的ref_typ_desc字段被定义为NUMBER(20)数值类型,但你插入的是'AA'、'BB'字符串类型值,该插入操作会执行失败,导致lookup_ref表为空。你的插入语句中使用了cross join lookup_ref l,当关联的右表为空时,SELECT查询返回的结果集行数为0,最终插入行数自然为0,不会触发额外报错。 - 插入语句逻辑冗余错误:你使用了不必要的交叉连接,且硬编码的CASE分支写法扩展性极差,不符合关联匹配的需求场景,还可能触发主键冲突问题。
修正步骤
第一步:修正lookup_ref表结构并重新插入测试数据
首先删除错误定义的lookup_ref表(如果存在),修改ref_typ_desc字段为字符串类型,再重新插入数据确保数据生效:
DROP TABLE lookup_ref; CREATE TABLE lookup_ref ( ref_id NUMBER(10), ref_typ VARCHAR2(30), ref_typ_desc VARCHAR2(50), -- 修正为字符串类型匹配存储内容 CONSTRAINT pk_lookup_ref PRIMARY KEY ( ref_id ) ); INSERT INTO lookup_ref VALUES (181, 'portal', 'AA'); INSERT INTO lookup_ref VALUES (182, 'portal', 'BB'); COMMIT;
第二步:修正插入语句
直接用内连接关联两个表获取匹配的ref_id即可,不需要冗余的CASE和子查询,后续新增映射关系也不需要修改SQL逻辑:
INSERT INTO new_details_main (e_id, e_name, portal) SELECT n.e_id, n.e_name, l.ref_id FROM new_details_staging n INNER JOIN lookup_ref l ON n.portal_desc = l.ref_typ_desc AND l.ref_typ = 'portal'; COMMIT;
最终执行效果
new_details_main表插入后的数据如下,符合预期:
| E_ID | E_NAME | PORTAL |
|---|---|---|
| 11 | A | 181 |
| 22 | B | 182 |
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

