when I run the query I get this error: ORA-06550

when I run the query I get this error: ORA-06550

我在 运行 这个查询时遇到这个错误。

PLS-00428: an INTO clause is expected in this SELECT statement

查询:

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 
    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;
end if;
END;

我预计会有 240,000 个这样的结果:

13000291956000774037
06000167340000223372
13000089241000246480
13000057283000105163
06001632092003471840
13000093581000257191
12000252313001947873
06000120216000066999
06000309294001948770
13000192054000285006

如您所知,SELECTIF 中的那个)缺少 then INTO 子句。您必须再声明一个局部变量并使用它:

DECLARE
  v_flag_tipo_factu varchar2(20);
  --
  v_result varchar2(50);                           --> this
BEGIN
  SELECT valor_param INTO v_flag_tipo_factu FROM t_param WHERE cod_param = 
  'TIPOFAC';

if v_flag_tipo_factu = 'FN' THEN 
    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)
    INTO v_result                                  --> this
    FROM
    ...

如果 select returns 单个值,它会起作用;否则,查询将引发

  • no_data_found如果没有满足条件的行
  • too_many_rows。如何处理?这取决于你想做什么...

如果您不喜欢 PL/SQL 规则,其中查询必须存储在每个步骤的变量中,您可以使用这样的查询,它应该 return 相同

with v as (
  SELECT valor_param FROM t_param WHERE cod_param = 'TIPOFAC'
)
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 AND
  EXISTS (select 1 from v where valor_param = 'FN')
GROUP BY cta.cod_correo, cta.num_cta_cte;