如何从批量收集的记录类型中选择

时间:2017-06-21 18:42:26

标签: oracle plsql bulk-collect

我有一个程序,我需要缓存一些数据,出于性能原因,为下游操作。

TYPE定义有用

BULK COLLECT INTO有效

SELECT不起作用

PROCEDURE MYPROC((PARAMS))AS

  TYPE REC_TYPE IS RECORD (
    COLUMN_1 (TABLEA.COLUMN_A)%TYPE,
    COLUMN_2 (TABLEA.COLUMN_B)%TYPE
  );

  TYPE TAB_TYPE IS TABLE OF REC_TYPE;

  TABLE_1 TAB_TYPE;

BEGIN

  SELECT  COLUMN_A, COLUMN_B
  BULK COLLECT INTO TABLE_1 
  FROM  TABLE_A;

  SELECT * FROM TABLE_1;

END MYPROC;

收益率:

  

错误(#,#):PL / SQL:ORA-00942:表或视图不存在

我也尝试将它包装在一个表格函数中,就像我在其他地方使用我的单列类型一样,但这也不起作用

SELECT * FROM TABLE(TABLE_1);
  

错误(#,#):PL / SQL:ORA-22905:无法访问非嵌套的行   表项目

1 个答案:

答案 0 :(得分:4)

您的问题实际上是PLS-00642错误,而不是ORA-22905。实质上,您不能在SQL语句中使用本地集合类型。因此,解决方案是在架构级别定义类型。以这种方式定义类型时,我们不能使用%TYPE语法,而是必须明确定义列(Getting PLS-00201 error while creating a type in oracle),即

create or replace type rec_type as object (
  COLUMN_1 integer,
  COLUMN_2 varchar2(128)
);

create or replace type tab_type as table of rec_type;

然后,您需要将值显式转换为相关类型,以便执行此处提到的批量收集:ORA-00947 Not enough values while declaring type globally

因此,您的程序将如下所示:

PROCEDURE MYPROC((PARAMS))AS
  TABLE_1 TAB_TYPE;
  lCount  integer;
BEGIN

  SELECT  REC_TYPE(COLUMN_A, COLUMN_B)
  BULK COLLECT INTO TABLE_1 
  FROM  TABLE_A;

  SELECT COUNT(*) INTO lCount FROM TABLE(TABLE_1);
END MYPROC;