执行Oracle PL/SQL查询报ORA-06550、PLS-00428错误求助
报错原因
PLS-00428错误的触发原因是:在PL/SQL块内部不允许直接执行返回多行结果的裸SELECT语句,所有块内的SELECT查询都必须指定结果的存储位置,单行结果用INTO子句赋值给变量,多行结果需要通过游标、集合或者插入表的方式处理。
解决方法
方案1:直接改写为普通SQL查询(最简便)
如果你没有其他PL/SQL逻辑需要执行,完全可以把参数判断逻辑整合到WHERE条件中,直接执行SQL即可返回你需要的24万行结果:
SELECT substr('00' || to_char(cta.cod_correo), -2) || substr('000000000' || to_char(cta.num_cta_cte), -9) || substr('000000000' || to_char(max(distinct fac.num_fac)),- 9) AS format_result FROM t_acc_const cta, t_fac fac WHERE cta.num_cta_cte = fac.num_cta_cte AND fac.num_factura < 900000000 AND EXISTS ( SELECT 1 FROM t_param WHERE cod_param = 'TIPOFAC' AND valor_param = 'FN' ) GROUP BY cta.cod_correo, cta.num_cta_cte;
方案2:保留PL/SQL块,用游标输出结果
如果你必须保留PL/SQL块结构(比如后续需要扩展其他逻辑),可以通过游标遍历结果并输出,执行前需要提前开启数据库输出功能:
-- 执行前先运行开启输出:SET SERVEROUTPUT ON SIZE UNLIMITED DECLARE v_flag_tipo_factu varchar2(20); v_result_line varchar2(20); -- 声明游标存储多行查询结果 CURSOR cur_format_data IS SELECT substr('00' || to_char(cta.cod_correo), -2) || substr('000000000' || to_char(cta.num_cta_cte), -9) || substr('000000000' || to_char(max(distinct fac.num_fac)),- 9) FROM t_acc_const cta, t_fac fac WHERE cta.num_cta_cte = fac.num_cta_cte AND fac.num_factura < 900000000 GROUP BY cta.cod_correo, cta.num_cta_cte; BEGIN SELECT valor_param INTO v_flag_tipo_factu FROM t_param WHERE cod_param = 'TIPOFAC'; IF v_flag_tipo_factu = 'FN' THEN OPEN cur_format_data; LOOP FETCH cur_format_data INTO v_result_line; EXIT WHEN cur_format_data%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_result_line); END LOOP; CLOSE cur_format_data; END IF; END; /
方案3:结果写入表中后续查询
如果需要留存结果供后续使用,可以先建一张存储结果的表,在PL/SQL块内直接插入数据:
-- 先建结果表 CREATE TABLE t_fac_format_result ( result_line varchar2(20) ); -- 执行PL/SQL插入数据 DECLARE v_flag_tipo_factu varchar2(20); BEGIN SELECT valor_param INTO v_flag_tipo_factu FROM t_param WHERE cod_param = 'TIPOFAC'; IF v_flag_tipo_factu = 'FN' THEN INSERT INTO t_fac_format_result(result_line) SELECT substr('00' || to_char(cta.cod_correo), -2) || substr('000000000' || to_char(cta.num_cta_cte), -9) || substr('000000000' || to_char(max(distinct fac.num_fac)),- 9) FROM t_acc_const cta, t_fac fac WHERE cta.num_cta_cte = fac.num_cta_cte AND fac.num_factura < 900000000 GROUP BY cta.cod_correo, cta.num_cta_cte; COMMIT; END IF; END; / -- 后续直接查询结果即可 SELECT * FROM t_fac_format_result;
内容的提问来源于stack exchange,提问作者mohamed
相关产品推荐
相关产品推荐

