不使用游标将多个记录存储到变量中

时间:2017-05-25 06:36:12

标签: oracle plsql

我的表结构如下:

desc temp_table ;
Name                       Null?    Type

student_name                        VARCHAR2(500)
Is_delete                           NUMBER(2)

使用pl sql程序我试图将上表的所有值存储到变量中。

如果表格有多行,那么我会收到类似

的错误
  

ORA-01422:精确提取返回超过请求的行数

所以不使用游标我们如何在变量中存储多行?

1 个答案:

答案 0 :(得分:1)

定义两种集合类型:

CREATE OR REPLACE TYPE StringList IS TABLE OF VARCHAR2(4000);
/

CREATE OR REPLACE TYPE BooleanList IS TABLE OF NUMBER(1,0);
/

使用BULK COLLECT INTO

CREATE OR REPLACE PROCEDURE UPDATE_TABLE
AS
  Names StringList;
  Del   BooleanList;
BEGIN
  DBMS_OUTPUT.ENABLE(1000000);
  SELECT student_name,
         Is_delete
  BULK COLLECT INTO
         Names,
         Del
  FROM   temp_table
  WHERE  MODIFIED_DATE >= TRUNC( SYSDATE )
  AND    MODIFIED_DATE <  TRUNC( SYSDATE ) + INTERVAL '1' DAY;

  DBMS_OUTPUT.PUT_LINE ('Number Of Names: ' || Names.COUNT );
  DBMS_OUTPUT.PUT_LINE ('Number Of Del: ' || Del.COUNT ); -- Will always be the same amount

  FOR i IN 1 .. Names.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE ( Names(i) || ', ' || Del(i) );
  END LOOP;
END;
/