Oracle存储过程如何从表随机选数据打印及PLS-00302报错解决
错误原因
现有存储过程的游标查询语句仅返回dbms_random.value(1,5)的计算值,未将name字段加入查询结果集,导致循环变量i不存在name属性,触发PLS-00302报错。此外原有逻辑无法实现「随机选取1到5条记录」的需求:sample(50)是按比例采样,无法控制返回行数稳定在1~5的范围内。
正确实现代码
修正后的存储过程
create or replace procedure random_child as begin -- 先随机排序,再取1~5条随机数的行数 for rec in ( select name, age from child order by dbms_random.value fetch first trunc(dbms_random.value(1,6)) rows only ) loop DBMS_OUTPUT.put_line('姓名:' || rec.name || ',年龄:' || rec.age); end loop; end; /
如果使用的Oracle版本低于12c,不支持fetch first语法,可以替换为子查询加rownum的写法:
create or replace procedure random_child as begin for rec in ( select name, age from ( select name, age from child order by dbms_random.value ) where rownum <= trunc(dbms_random.value(1,6)) ) loop DBMS_OUTPUT.put_line('姓名:' || rec.name || ',年龄:' || rec.age); end loop; end; /
执行方法
首先开启服务器输出:
SET SERVEROUTPUT ON;
执行存储过程:
EXEC random_child;
逻辑说明
order by dbms_random.value:对child表所有记录做完全随机排序,保证每次取的记录都是随机的trunc(dbms_random.value(1,6)):生成1~5的随机整数,作为本次要取出的记录条数(dbms_random.value为左闭右开区间,所以上限设为6才能取到最大值5)- 最终通过行数限制语法,返回对应条数的随机记录,完全符合需求
内容的提问来源于stack exchange,提问作者GEO
相关产品推荐
相关产品推荐

