【问题标题】:when I run the query I get this error: ORA-06550当我运行查询时出现此错误:ORA-06550
【发布时间】:2022-01-06 12:47:48
【问题描述】:

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

PLS-00428:此 SELECT 语句中需要一个 INTO 子句

查询:

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

【问题讨论】:

  • 作为错误状态,在 PL/SQL 块中,有必要使用 into sintax 将查询返回的数据存储在某个变量中。
  • 阅读手册。特别是Select Into

标签: sql database oracle plsql


【解决方案1】:

正如你所说,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 返回单个值,它将起作用;否则,查询将引发

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

【讨论】:

  • 这个查询返回 241338 个这样的结果 13000291956000774037
  • 这意味着您不能将其选择为标量变量。你打算用 240.000 行做什么?也许使用游标 FOR LOOP “解决”了问题(因为您将分别处理每一行)?或者,(批量)选择一个集合?正如我所说,这取决于你想做什么。
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2021-12-28
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多