Попытка обновить flexfields на сайте поставщика Oracle. Курсор не работает

Я новичок в PL/SQL, и у меня возникли проблемы с его запуском. Я пытаюсь передать vendor_site_id в двух местах, используя свой курсор. (В конце концов список будет длиннее, просто попробуйте в Dev с двумя идентификаторами)

Код был получен от Oracle, однако мы пытаемся пройти массовое обновление для этих flexfields.

Вот:

SET SERVEROUTPUT ON
DECLARE
  lc_return_status                VARCHAR2(2000);
  ln_msg_count                   NUMBER;
  ll_msg_data                      LONG;
  Ln_Vendor_Id                 NUMBER;
  Ln_Vendor_site_Id         NUMBER;
  ln_message_int                NUMBER;
  Ln_Party_Id                     NUMBER;
  lrec_vendor_site_rec ap_vendor_pub_pkg.r_vendor_site_rec_type;

CURSOR cVendorSite 
IS
    SELECT VENDOR_SITE_ID 
    FROM ap_supplier_SITES_ALL
    where vendor_site_id IN ('1631833', '1630833');


BEGIN
FOR rVendorSite IN cVendorSite
LOOP  
  Ln_Vendor_site_Id := rVendorSite.vendor_site_id; 
  Lrec_Vendor_site_Rec.vendor_site_id := rVendorSite.vendor_site_id;
  Lrec_Vendor_site_Rec.ATTRIBUTE1 := 'Yes';

  AP_VENDOR_PUB_PKG.Update_Vendor_Site_public ( p_api_version => 1,--
  x_return_status => lc_return_status,                 --
  x_msg_count => ln_msg_count,                         --
  x_msg_data => ll_msg_data,                           --
  p_vendor_site_rec => Lrec_Vendor_site_Rec,                     --
  p_Vendor_site_Id => Ln_Vendor_site_Id);

  IF (lc_return_status <> 'S') THEN
    IF ln_msg_count    >= 1 THEN
      FOR v_index IN 1..ln_msg_count
      LOOP
        fnd_msg_pub.get (p_msg_index => v_index, p_encoded => 'F', p_data => ll_msg_data, p_msg_index_out => ln_message_int );
        Ll_Msg_Data := 'UPDATE_VENDOR_SITE '||SUBSTR(Ll_Msg_Data,1,3900);
        dbms_output.put_line('Ll_Msg_Data - '||Ll_Msg_Data );
      END LOOP;
    End If;
  END IF;
END LOOP --Cursor Loop

EXCEPTION
WHEN OTHERS THEN
      dbms_output.put_line('SQLERRM - '||SQLERRM );
END;
/

COMMIT;
EXIT;

person TMillz    schedule 20.06.2017    source источник
comment
как это не работает? Я вижу генерацию динамического sql, но не вижу его выполнения.   -  person T Gray    schedule 21.06.2017


Ответы (1)


END LOOP Требуется точка с запятой

У вас есть END LOOP --Cursor Loop

Нужна точка с запятой:

END LOOP; --Cursor Loop

Как только я изменяю этот блок plsql, я просто определяю два supplier_site_id, которые я могу изменить вместо (1631833, 1630833). Конечно, выполните это для своего supplier_site_id.

С этим условием у вас неверный тип данных для supplier_site_id. Это тип NUMBER, а не VARCHAR2. Я ожидаю, что база данных будет динамически преобразовывать эти VARCHAR2 обратно в NUMBER во время выполнения.

Прежде чем я вызову блок, вот значения, связанные с двумя сайтами, которые я выбрал (оба NULL), используя SQLCl:

APPS@dev>SELECT
  2      attribute1
  3  FROM
  4      apps.ap_supplier_sites_all
  5  WHERE
  6      vendor_site_id IN (
  7          812119,812118
  8      );
ATTRIBUTE1  

Затем я вызываю блок plsql, который вызывает API приложений Oracle, связанный с выполнением обновлений записей сайта поставщика:

APPS@dev>DECLARE
  2      lc_return_status       VARCHAR2(2000);
  3      ln_msg_count           NUMBER;
  4      ll_msg_data            LONG;
  5      ln_vendor_id           NUMBER;
  6      ln_vendor_site_id      NUMBER;
  7      ln_message_int         NUMBER;
  8      ln_party_id            NUMBER;
  9      lrec_vendor_site_rec   ap_vendor_pub_pkg.r_vendor_site_rec_type;
 10      CURSOR cvendorsite IS
 11          SELECT
 12              vendor_site_id
 13          FROM
 14              ap_supplier_sites_all
 15          WHERE
 16              vendor_site_id IN (
 17          812119,812118
 18              );
 19  
 20  BEGIN
 21      FOR rvendorsite IN cvendorsite LOOP
 22          ln_vendor_site_id := rvendorsite.vendor_site_id;
 23          lrec_vendor_site_rec.vendor_site_id := rvendorsite.vendor_site_id;
 24          lrec_vendor_site_rec.attribute1 := 'Yes';
 25          ap_vendor_pub_pkg.update_vendor_site_public(
 26              p_api_version       => 1,--
 27              x_return_status     => lc_return_status,                --
 28              x_msg_count         => ln_msg_count,                        --
 29              x_msg_data          => ll_msg_data,                          --
 30              p_vendor_site_rec   => lrec_vendor_site_rec,                    --
 31              p_vendor_site_id    => ln_vendor_site_id
 32          );
 33  
 34          IF
 35              ( lc_return_status <> 'S' )
 36          THEN
 37              IF
 38                  ln_msg_count >= 1
 39              THEN
 40                  FOR v_index IN 1..ln_msg_count LOOP
 41                      fnd_msg_pub.get(
 42                          p_msg_index       => v_index,
 43                          p_encoded         => 'F',
 44                          p_data            => ll_msg_data,
 45                          p_msg_index_out   => ln_message_int
 46                      );
 47  
 48                      ll_msg_data := 'UPDATE_VENDOR_SITE '
 49                       || substr(
 50                          ll_msg_data,
 51                          1,
 52                          3900
 53                      );
 54                      dbms_output.put_line('Ll_Msg_Data - ' || ll_msg_data);
 55                  END LOOP;
 56  
 57              END IF;
 58          END IF;
 59  
 60      END LOOP; --Cursor Loop
 61  EXCEPTION
 62      WHEN OTHERS THEN
 63          dbms_output.put_line('SQLERRM - ' || sqlerrm);
 64  END;
 65  /

PL/SQL procedure successfully completed.

Затем я проверяю эти записи, чтобы увидеть обновления, которые мы только что сделали, вызвав API обновления сайта поставщика:

APPS@dev>SELECT
  2      attribute1
  3  FROM
  4      apps.ap_supplier_sites_all
  5  WHERE
  6      vendor_site_id IN (
  7          812119,812118
  8      );
ATTRIBUTE1  
Yes         
Yes         

Поскольку я не выполнял коммит, я откатываю свои изменения, чтобы оставить записи без изменений:

APPS@dev>rollback;

Rollback complete.

APPS@dev>SELECT
  2      attribute1
  3  FROM
  4      apps.ap_supplier_sites_all
  5  WHERE
  6      vendor_site_id IN (
  7          812119,812118
  8      );
ATTRIBUTE1  

Таким образом, мое окружение не изменилось.

person Patrick Bacon    schedule 20.06.2017
comment
спасибо. Как человек, который относительно новичок в этом, я нашел это невероятно полезным. - person TMillz; 21.06.2017
comment
@TMillz Если это позволило вам выполнить и проверить блок plsql, не стесняйтесь принять ответ, stackoverflow.com/help/someone-answers - person Patrick Bacon; 21.06.2017