PL/SQL技术求助:基于TPCH数据集统计各国家供应商数量时的报错与输出异常问题
解决PL/SQL统计国家供应商数量的问题
先来说说你代码里的几个关键问题:
1. 游标查询中的INTO子句错误
你在游标SELECT语句里加了INTO countNationkey,这是不对的。SELECT ... INTO是PL/SQL中用来单行查询结果赋值给变量的语法,但游标查询返回的是多行结果集,不能在这里用INTO。正确的做法是把count(s_nationkey)作为游标结果集的一个列(可以给它起个别名,比如supplier_count),之后在循环里直接引用这个列的值。
2. 重复打印表头
你的循环里每次都会打印表头和分隔线,这就导致每一行数据前都重复出现表头,和你期望的输出不符。应该把表头和分隔线放在循环外面,只打印一次。
修正后的完整代码
DECLARE -- 不需要单独声明countNationkey,直接从游标获取统计值 CURSOR supplier_cursor IS SELECT r_name, n_name, COUNT(s_nationkey) AS supplier_count FROM region JOIN nation ON r_regionkey = n_regionkey JOIN supplier ON n_nationkey = s_nationkey GROUP BY r_name, n_name HAVING COUNT(s_nationkey) > 130 ORDER BY r_name; BEGIN -- 先打印一次表头和分隔线 DBMS_OUTPUT.PUT_LINE( RPAD('R_NAME', 25) || RPAD('N_NAME', 25) || RPAD('COUNT(S_NATIONKEY)', 20) ); DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------'); -- 遍历游标结果 FOR q_row IN supplier_cursor LOOP DBMS_OUTPUT.PUT_LINE( RPAD(q_row.r_name, 25) || RPAD(q_row.n_name, 25) || RPAD(q_row.supplier_count, 20) ); END LOOP; END; /
代码修改说明
- 用显式游标(也可以继续用隐式游标,但显式更清晰)重新定义查询,去掉了多余的
s_nationkey和r_regionkey(因为GROUP BY里不需要它们,统计只需要按地区和国家分组),并给统计列起了别名supplier_count。 - 使用
JOIN语法替代旧的逗号连接表的方式,让SQL可读性更强。 - 把表头打印逻辑移到循环外,避免重复输出。
- 在循环中直接引用游标行的
supplier_count列,不需要额外变量存储统计值。
执行后你会得到期望的输出:
R_NAME N_NAME COUNT(S_NATIONKEY) ---------------------------------------------------------- ASIA CHINA 145 ASIA INDONESIA 131 EUROPE GERMANY 132 MIDDLE EAST SAUDI ARABIA 132
内容的提问来源于stack exchange,提问作者new2plsql
相关产品推荐
相关产品推荐

