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

Posted

技术标签:

【中文标题】如何从批量收集的记录类型表中进行选择【英文标题】:How do I select from Bulk Collected Table of Records Type 【发布时间】:2017-06-21 18:42:26 【问题描述】:

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

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】:

您的问题实际上是 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;

【讨论】:

感谢您的回答!我怀疑不可能内联定义对象,但唉,这是真的:Possible to create Oracle Database object types inside of PL/SQL? 你甚至不能全局创建对象和内联表,否则你会得到Error(#,#): PLS-00642: local collection types not allowed in SQL statements

以上是关于如何从批量收集的记录类型表中进行选择的主要内容,如果未能解决你的问题,请参考以下文章

使用联合从 MS Access 表中选择随机记录 [重复]

如何从基于嵌套 json 的 BigQuery 表中进行选择?

如何从mysql中的表中选择N条记录

MySQL 如何从今天记录的表中选择数据?

PLSQL - 批量收集的最大限制?

如何从表中选择记录并插入另一个表?