Tom*_*day 6 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;
Run Code Online (Sandbox Code Playgroud)
产量:
错误(#,#):PL/SQL:ORA-00942:表或视图不存在
我也尝试将它包装在一个表函数中,就像我在其他地方使用我的单列类型一样,但这也不起作用
SELECT * FROM TABLE(TABLE_1);
Run Code Online (Sandbox Code Playgroud)
错误(#,#):PL/SQL:ORA-22905:无法访问非嵌套表项的行
您的问题实际上是PLS-00642错误,而不是ORA-22905。本质上,您不能在SQL语句中使用本地集合类型。因此,解决方案是在架构级别定义类型。当以这种方式定义类型时,我们不能使用%TYPE语法,而必须显式定义列(在oracle中创建类型时出现PLS-00201错误),即
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;
Run Code Online (Sandbox Code Playgroud)
然后,您需要将这些值显式转换为相关类型,以执行此处所述的批量收集:ORA-00947全局声明类型时没有足够的值。
因此,您的过程将如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4365 次 |
| 最近记录: |