我如何 select 从批量收集 Table 的记录类型
How do I select from Bulk Collected Table of Records Type
出于性能原因,我有一个过程需要缓存一些数据以用于下游操作。
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
我也试过将它包装在一个 table 函数中,就像我在其他地方处理我的单列类型一样,但这也不起作用
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;
出于性能原因,我有一个过程需要缓存一些数据以用于下游操作。
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
我也试过将它包装在一个 table 函数中,就像我在其他地方处理我的单列类型一样,但这也不起作用
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;