在plsql中使用批量收集和forall更新记录时出现问题

问题描述 投票:0回答:1
set serveroutput on DECLARE
TYPE type_id IS
    TABLE OF policies_tab.id%TYPE;
TYPE type_create_dat IS
    TABLE OF policies_tab.create_dat%TYPE;
t_id         type_id;
t_create_dat type_create_dat;
BEGIN

select id,create_dat  BULK COLLECT INTO t_id,t_create_dat from policies_tab where        substr(id,-1) in(6);

FORall i in t_id.first .. t_id.last
update policy_aggr set create_dat =t_create_dat(i).create_dat
where pol_id =t_id(i).id;
--dbms_output.put_line(t_id(i));
EXCEPTION
WHEN OTHERS THEN
    dbms_output.put_line('Error while updating record in policy_aggr table' ||   sqlerrm);
    ROLLBACK;
end;

编译时出现错误 t_id 和 t_id(i).id 必须声明,即使我在顶部声明 有人可以解释一下我在这里缺少什么以及错误的原因是什么

sql plsql plsqldeveloper plsql-package oracle
1个回答
0
投票
--      S a m p l e    D a t a :
Create Table policies_tab AS
Select Cast( 6 as Number(6) ) as ID, To_Date('01.11.2024', 'dd.mm.yyyy') as CREATE_DAT From Dual Union All
Select 16, To_Date('05.11.2024', 'dd.mm.yyyy') From Dual Union All
Select 21, To_Date('18.11.2024', 'dd.mm.yyyy') From Dual ;

Create Table policy_aggr AS
Select Cast( 6 as Number(6) ) as POL_ID, To_Date('01.10.2024', 'dd.mm.yyyy') as CREATE_DAT From Dual Union All
Select 16, Null From Dual Union All
Select 21, Null From Dual ;
Select * From policies_tab;
身份证 创建_DAT
6 24 年 11 月 1 日
16 24 年 11 月 5 日
21 24 年 11 月 18 日
Select * From policy_aggr;
POL_ID 创建_DAT
6 24 年 10 月 1 日
16
21

像这里一样尝试 - 你的代码稍微调整了......

Declare
    TYPE type_id IS TABLE OF policies_tab.id%TYPE
        INDEX BY PLS_INTEGER;
    t_id         type_id;
    --
    TYPE type_create_dat IS TABLE OF policies_tab.create_dat%TYPE
        INDEX BY PLS_INTEGER;
    t_create_dat type_create_dat;
Begin
    Select id, create_dat  BULK COLLECT INTO t_id, t_create_dat 
    From   policies_tab 
    Where  Substr(id, -1) IN( '6' );
    --
    FOR i in 1.. t_id.count LOOP  
        Update policy_aggr SET CREATE_DAT = t_create_dat(i)
        Where pol_id = t_id(i);
    END LOOP;
    --
EXCEPTION
WHEN OTHERS THEN
    dbms_output.put_line('Error while updating record in policy_aggr table' ||   sqlerrm);
    ROLLBACK;
End;
/
Select * From policy_aggr;
POL_ID 创建_DAT
6 24 年 11 月 1 日
16 24 年 11 月 5 日
21

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.