使用PL/SQL块填充Sales_Facts表无结果排查求助
这种情况我碰到过好几次,明明PL/SQL块跑起来没报错,但查不到数据,大概率是这几个常见原因之一,咱们一步步来排查:
1. 先确认源表Sales有没有符合条件的数据
你要填充Sales_Facts,肯定是从Sales或关联表取数据吧?先别管PL/SQL,直接跑个查询摸底:
SELECT COUNT(*) FROM Sales;
如果这个结果是0,那问题根源就在这,先把Sales表的数据搞定再说。
如果Sales有数据,那把你PL/SQL块里用来获取插入数据的查询语句单独拎出来执行,比如你块里可能有个游标或者SELECT INTO的语句,带过滤条件的那种:
-- 替换成你PL/SQL里的源查询 SELECT COUNT(*) FROM Sales WHERE vehicle_status = 'SOLD';
要是这个结果也是0,说明你的过滤条件太严格,没有符合的记录,自然插不进数据。
2. 检查事务有没有提交
PL/SQL默认不会自动提交事务!如果你的块执行完没加COMMIT;,那数据只是暂存在当前事务里,其他会话(甚至你同一个会话如果没开自动提交)都查不到。
解决办法:
- 如果是匿名PL/SQL块,直接在末尾加上
COMMIT;,比如:BEGIN -- 你的插入逻辑 INSERT INTO Sales_Facts (...) SELECT ... FROM Sales; COMMIT; -- 加上这句提交事务 END; / - 如果是调用存储过程,执行完过程后手动跑
COMMIT;再查询。
3. 调试PL/SQL块,确认插入逻辑真的执行了
有时候块里的条件判断会导致INSERT根本没触发,比如你写了IF mileage > 1000 THEN INSERT ... END IF;,但Sales里的mileage全是小于等于1000的。
给块加个调试输出,看看到底处理了多少条记录:
SET SERVEROUTPUT ON; -- 先开启控制台输出 DECLARE v_insert_count NUMBER := 0; BEGIN -- 假设你是用循环处理数据 FOR sale_rec IN (SELECT sale_id, salesperson_id, cust_id FROM Sales) LOOP INSERT INTO Sales_Facts (sale_id, salesperson_id, cust_id) VALUES (sale_rec.sale_id, sale_rec.salesperson_id, sale_rec.cust_id); v_insert_count := v_insert_count + 1; END LOOP; -- 输出插入数量 DBMS_OUTPUT.PUT_LINE('总共尝试插入 ' || v_insert_count || ' 条记录'); COMMIT; END; /
执行完看控制台输出,如果是0,说明循环根本没进入,也就是源查询没返回数据;如果是大于0的数,那提交后再查Sales_Facts肯定有数据。
4. 确认你操作的是正确的Sales_Facts表
有时候会遇到同名表的情况,比如其他用户下也有个Sales_Facts,你没加schema前缀,结果插去了别人的表,自己查的是当前用户的空表。
跑这个查询确认所有同名表:
SELECT owner, table_name, tablespace_name FROM all_tables WHERE UPPER(table_name) = 'SALES_FACTS';
然后逐个检查这些表的数据:
-- 比如如果有个表属于SCOTT用户,就查 SELECT COUNT(*) FROM SCOTT.SALES_FACTS;
说不定数据都插去别的用户的表里了。
按照这几步排查,应该能很快找到问题所在。
内容的提问来源于stack exchange,提问作者beginnerDeveloper

