gpt4 book ai didi

oracle - 无法使用 BULK COLLECT 和 FORALL 编译 PL/SQL

转载 作者:行者123 更新时间:2023-12-02 06:20:05 29 4
gpt4 key购买 nike

我在创建此过程时遇到以下错误。

CREATE OR replace PROCEDURE Remove_sv_duplicate
IS
TYPE sv_bulk_collect
IS TABLE OF tt%ROWTYPE;
sv_rec SV_BULK_COLLECT;
CURSOR cur_data IS
SELECT *
FROM tt
WHERE ROWID IN (SELECT ROWID
FROM (SELECT ROWID,
Row_number () over (PARTITION BY portingtn,
nnsp
, onsp,
spid,
Trunc(
createddate,
'MI') ORDER BY portingtn) dup
FROM tt)
WHERE dup > 1);
BEGIN
OPEN cur_data;

LOOP
FETCH cur_data BULK COLLECT INTO sv_rec LIMIT 1000;

FORALL i IN 1..sv_rec.COUNT
INSERT INTO soa_temp_sv_refkey_fordelete
(referencekey,
spid,
nnsp,
onsp,
portingtn)
(SELECT referencekey,
spid,
nnsp,
onsp,
portingtn
FROM tt
WHERE portingtn = Sv_rec(i).portingtn
AND spid = Sv_rec(i).spid
AND nnsp = Sv_rec(i).nnsp
AND onsp = Sv_rec(i).onsp
AND svid IS NULL);

EXIT WHEN cur_data%notfound;
END LOOP;

CLOSE cur_data;

COMMIT;
END;

程序

Error(23,5): PL/SQL: SQL Statement ignored  
Error(25,27): PLS-00382: expression is of wrong type
Error(25,27): PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records
Error(26,27): PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records
Error(26,27): PLS-00382: expression is of wrong type
Error(27,27): PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records
Error(27,27): PLS-00382: expression is of wrong type
Error(28,27): PL/SQL: ORA-22806: not an object or REF
Error(28,27): PLS-00382: expression is of wrong type
Error(28,27): PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records

最佳答案

使用 FORALL 时,您无法*引用各个字段 - 这就是您收到 PLS-00436 错误的原因。

为了解决这个问题,您必须使用关联数组来引用各个字段。

DECLARE

TYPE tt_rectype IS RECORD (
referencekey tt.referencekey%TYPE,
spid tt.spid%TYPE,
nnsp tt.hiredate%TYPE,
onsp tt.deptno%TYPE,
portingtn tt.portingtn%TYPE);

TYPE tt_aa_type
IS TABLE OF TT_RECTYPE INDEX BY PLS_INTEGER;

tt_aa TT_AA_TYPE;
CURSOR cur_data IS
SELECT *
FROM tt
WHERE ROWID IN (SELECT ROWID
FROM (SELECT ROWID,
Row_number () over (PARTITION BY portingtn
,
nnsp
, onsp,
spid,
Trunc(
createddate
, 'MI') ORDER BY portingtn) dup
FROM tt)
WHERE dup > 1);
BEGIN
OPEN cur_data;

LOOP
FETCH cur_data BULK COLLECT INTO tt_aa LIMIT 1000;

FORALL i IN 1..tt_aa.COUNT
INSERT INTO soa_temp_sv_refkey_fordelete
(referencekey,
spid,
nnsp,
onsp,
portingtn)
(SELECT referencekey,
spid,
nnsp,
onsp,
portingtn
FROM tt
WHERE portingtn = Tt_aa(i).portingtn
AND spid = Tt_aa(i).spid
AND nnsp = Tt_aa(i).nnsp
AND onsp = Tt_aa(i).onsp
AND svid IS NULL);

EXIT WHEN cur_data%notfound;
END LOOP;

CLOSE cur_data;

COMMIT;
END;

*请注意,Oracle 11g+ 中不再存在此限制

<小时/>

此外,如@jonearles comments ,您可以只使用单个 SQL 语句...

INSERT INTO soa_temp_sv_refkey_fordelete
(referencekey,
spid,
nnsp,
onsp,
portingtn)
SELECT referencekey,
spid,
nnsp,
onsp,
portingtn
FROM tt
WHERE ROWID IN (SELECT ROWID
FROM (SELECT ROWID,
Row_number () over (PARTITION BY portingtn, nnsp
, onsp,
spid,
Trunc(
createddate
, 'MI') ORDER BY portingtn) dup
FROM tt)
WHERE dup > 1);

关于oracle - 无法使用 BULK COLLECT 和 FORALL 编译 PL/SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169429/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com