Массовый сбор с помощью функции Sum
Я пытаюсь использовать Bulk All и Forall в базе данных Oracle:
Оригинальный код из процедуры, как показано ниже:
IF NVL(v_mc,0) != 0 THEN
FOR rec IN
(SELECT a.testid,
SUM(pct * NVL(cap,0))/v_mc lead1
BULK COLLECT INTO testids1, testids2
FROM testtable a
WHERE a.id = n_id
AND a.type =n_type
GROUP BY a.testid;
)
LOOP
UPDATE testtable
SET LEAD1 =ROUND(testids2(i),2)
WHERE tid = n_id
AND type = n_type
AND testid =testids1(i);
END LOOP;
END IF;
Так что в операторе select я использую функцию Sum, а также здесь использую псевдонимы.
Код, который я написал, который использует Bulk collect и Forall, выглядит следующим образом:
PROCEDURE test
IS
TYPE test1Tab IS TABLE OF sh_rpt_temp_peer_wip.test1%TYPE;
TYPE test2Tab IS TABLE OF testtable.lead1%TYPE;
testids1 testidTab; --Error 1 and Error 2
testids2 LeadTab;
BEGIN
IF NVL(v_mc,0) != 0 THEN
SELECT testid,
SUM(pct * NVL(cap,0))/v_mc lead1
BULK COLLECT INTO testids1, testids2
FROM testtable a --Error 3
WHERE a.id = n_id
AND a.type =n_type
GROUP BY a.testid ORDER BY a.testid;
FORALL i IN testids1.FIRST..testids1.LAST
UPDATE testtable
SET LEAD1 =ROUND(testids2(i),2)
WHERE tid = n_id --Error 3
AND type = n_type
AND testid =testids1(i);
END IF;
END;
Но во время компиляции я получаю несколько ошибок. Я очень плохо знаком с PL/SQL. Пожалуйста, дайте мне знать, если я могу получить вычисленное значение в виде столбца в Bulk Collect? Я получаю ниже ошибки в процедуре:
- Ошибка 1) PL/SQL: элемент игнорируется
- Ошибка 2) должен быть объявлен компонент "LEAD"
- Ошибка 3) выражение имеет неправильный тип
Пожалуйста, дайте мне знать, что здесь не так
Спасибо
1 ответ
Поскольку я определил, что тип коллекции, на которую вы ссылаетесь, не входит в сферу действия процедуры, возможно, вы объявлены глобально. Я изменил ваш код, попробуйте один раз, надеюсь, он работает для вас.
PROCEDURE test
IS
TYPE test1Tab IS TABLE OF testtable.testid%TYPE;
TYPE test2Tab IS TABLE OF number;
testids1 test1Tab; //Error 1 and Error 2
testids2 test2Tab;
BEGIN
IF NVL(v_mc,0) != 0 THEN
SELECT testid,
SUM(pct * NVL(cap,0))/v_mc lead
BULK COLLECT INTO testids1, testids2
FROM testtable a //Error 3
WHERE a.id = n_id
AND a.type =n_type
GROUP BY a.testid ORDER BY a.testid;
FORALL i IN testids1.FIRST..testids1.LAST
UPDATE testtable
SET LEAD = ROUND(testids2(i),2)
WHERE tid = n_id //Error 3
AND type = n_type
AND testid = testids1(i);
END IF;
END;