【问题标题】:If count(column) Then Select in Oracle如果 count(column) 然后在 Oracle 中选择
【发布时间】:2020-09-10 05:45:27
【问题描述】:

我可以在 oracle 中做这样的事情吗? 我想检查结果数据集是否超过 20k 条记录然后不要选择,如果少于 20k 然后选择。

DECLARE cnt number;
BEGIN
select count(*) into cnt from ir_mpn where material LIKE '%A00%';
IF cnt > 20000 THEN
   select manuf_part, material, vendor, vendor_name from ir_mpn where material LIKE '%A00%';
END IF;
END;

我尝试这样做但显示错误:

ORA-06550: line 6, column 4:
PLS-00428: an INTO clause is expected in this SELECT statement

对我有更好的建议吗?

【问题讨论】:

    标签: sql oracle if-statement


    【解决方案1】:

    这是 PL/SQL,因此您的 SELECT 语句需要 INTO 子句。当您要返回数千行时,您不能将它们返回到标量变量中,但是例如集合或引用光标。

    但是,如果您想在 SQL 中执行此操作,请查看这是否有帮助;示例基于 Scott 的 DEPT 表:

    SQL> select * from dept;
    
        DEPTNO DNAME                LOC
    ---------- -------------------- --------------------
            10 ACCOUNTING           NEW YORK
            20 RESEARCH             DALLAS
            30 SALES                CHICAGO
            40 OPERATIONS           BOSTON
    

    如果行数小于 3,我想从中选择行;由于行数为 4,因此不返回任何内容:

    SQL> select * from dept
      2  where 3 >= (select count(*) from dept);
    
    no rows selected
    

    5 行怎么样?

    SQL> select * from dept
      2  where 5 >= (select count(*) from dept);
    
        DEPTNO DNAME                LOC
    ---------- -------------------- --------------------
            10 ACCOUNTING           NEW YORK
            20 RESEARCH             DALLAS
            30 SALES                CHICAGO
            40 OPERATIONS           BOSTON
    
    SQL>
    

    在你的情况下:

    select manuf_part, material, vendor, vendor_name 
    from ir_mpn 
    where material LIKE '%A00%'
      and 20000 >= (select count(*) 
                    from ir_mpn
                    where material like '%A00%'
                   );
    

    【讨论】:

    • 非常感谢!!但这仅适用于简单的直接查询。如果需要长时间的连接查询,则需要时间。
    • 当然可以。天下没有免费的午餐。
    • 或者换句话说,当查询已经读取并处理了 20k 条记录时,我可以终止 Oracle 中的查询吗?
    • 最简单的选择是select ... from ir_mpn where ... and rownum <= 20000;最后一个条件将确保查询最多返回 20.000 行
    • 澄清一下,如果匹配的行数少于 20,001,是否不返回任何内容,并且将结果总数限制为 20K?所以如果有 15K 行,什么都不显示,如果有 25K 行,则显示 20K?
    【解决方案2】:

    是的。取决于你想达到什么目标。

    在 PL/SQL 中,您不能使用普通的 SELECT 返回行。 一些选项是使用INTO(就像您对COUNT() 所做的那样)或使用光标(如下所示)。

    简单的方法是:

    for r_material in (select manuf_part, material, vendor, vendor_name from ir_mpn where material LIKE '%A00%') loop
     -- process each r_material record here f.e.
     -- if r_material.vendor = 'ORACLE' then...
    end loop;
    

    【讨论】:

    • 明白。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2016-09-27
    • 2021-07-13
    • 2022-10-13
    相关资源
    最近更新 更多