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

标签 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;

产量:

Error(#,#): PL/SQL: ORA-00942: table or view does not exist

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

SELECT * FROM TABLE(TABLE_1);

Error(#,#): PL/SQL: ORA-22905: cannot access rows from a non-nested table item

最佳答案

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

关于oracle - 如何从批量收集的记录表类型中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44683875/

相关文章:

sql - 如何从表中获取第二大或第三大条目

java - 通过 JDBC 连接 Oracle 11g 时用户名/密码无效(110% 确定登录凭据正确)

java - 如何查找Oracle中SQL查询中返回的记录的内存大小?

sql - 如何在 SQL 中组合WITH语句和INSERT INTO

plsql - 执行触发器期间出现“数字或值错误”

oracle - "Select ... into .."语句以 "table or view does not exist"失败,即使它不应运行

sql - PL/SQL varchar(10)到varchar(9)

oracle - 多次插入类型表集合

oracle - PLS-00497 : cannot mix between single row and multi-row (BULK) in INTO list

oracle - BULK COLLECT 的奇怪行为