Массовый сбор с помощью функции Sum - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь использовать 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 Ответ

0 голосов
/ 13 июня 2018

Поскольку я определил, что тип коллекции, на которую вы ссылаетесь, не входит в область действия процедуры, возможно, вы объявлены глобально.Я изменил ваш код, попробуйте один раз, надеюсь, он работает для вас.

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;
...