oracle pl/sql函数中如何在一个变量中存储多行?

x4shl7ld  于 2023-02-11  发布在  Oracle
关注(0)|答案(4)|浏览(338)

我正在写一个pl/sql函数,需要从select语句中选择多行:

SELECT pel.ceid
    FROM pa_exception_list pel
    WHERE trunc(pel.creation_date) >= trunc(SYSDATE-7)

如果我用途:

SELECT pel.ceid
INTO v_ceid

它只存储了一个值,但是我需要存储这个select返回的所有值,由于这是一个函数,我不能只使用简单的select,因为我得到了错误,“INTO- is expected”。

mbjcgjjk

mbjcgjjk1#

你可以使用一个记录类型来做这件事。下面的例子应该适合你

DECLARE
    TYPE v_array_type IS VARRAY (10) OF NUMBER;
        var v_array_type;
BEGIN
    SELECT x
    BULK COLLECT INTO
        var 
    FROM (
            SELECT 1 x
            FROM dual
            UNION
            SELECT 2 x
            FROM dual
            UNION
            SELECT 3 x
            FROM dual
        );
        FOR I IN 1..3 LOOP
              dbms_output.put_line(var(I));
            END LOOP;

END;

所以在你的情况下,它会像这样

select pel.ceid 
  BULK COLLECT INTO <variable which you create>
  from pa_exception_list
 where trunc(pel.creation_Date) >= trunc(sysdate-7);
3hvapo4f

3hvapo4f2#

如果你真的需要存储多行,检查BULK COLLECT INTO语句和例子,但是也许FOR游标LOOP和逐行处理会是更好的决定。

tyky79it

tyky79it3#

您可以将所有列存储在一个rowtype参数中,然后显示您想要显示的列(假设ceid是您的主键列,col12是您的表中的其他一些列):

SQL> set serveroutput on;
SQL> declare
  l_exp pa_exception_list%rowtype;
begin
 for c in  (   select *
                 from pa_exception_list pel
                where trunc(pel.creation_date) >= trunc(SYSDATE-7) 
           ) -- to select multiple rows
 loop     
      select *
        into l_exp            
        from pa_exception_list
       where ceid = c.ceid; -- to render only one row( ceid is primary key )

      dbms_output.put_line(l_exp.ceid||' - '||l_exp.col1||' - '||l_exp.col2); -- to show the results     
 end loop;
end;
/
jdgnovmf

jdgnovmf4#

SET SERVEROUTPUT ON

BEGIN
    FOR rec IN (
        --an implicit cursor is created here
        SELECT pel.ceid AS ceid
        FROM pa_exception_list pel
        WHERE trunc(pel.creation_date) >= trunc(SYSDATE-7)
    )
    LOOP
        dbms_output.put_line(rec.ceid);
    END LOOP;

END;
/

here的注解:
在这种情况下,游标FOR LOOP声明、打开、提取和关闭隐式游标。但是,隐式游标是内部游标;因此,您不能引用它。
请注意,Oracle数据库会自动优化FOR LOOP游标,使其工作方式类似于BULK COLLECT查询。虽然您的代码看起来好像一次提取一行,但Oracle数据库一次提取多行,并允许您单独处理每一行。

相关问题