0

我对 PL/SQL 很陌生,并且在运行它时遇到了一些麻烦。我正在尝试使用光标在两个地方传递 vendor_site_id。(最终列表会更长,只需在 Dev 中尝试使用 2 个 ID)

该代码是从 Oracle 获得的,但是我们正在尝试为这些弹性域传递大量更新。

这里是:

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

1 回答 1

0

END LOOP需要分号

你有 END LOOP --Cursor Loop

它需要一个分号:

END LOOP; --Cursor Loop

一旦我修改了这个 plsql 块,我只需确定两个supplier_site_id可以修改的 's 来代替 (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 块,该块调用与对供应商站点记录执行更新相关联的 Oracle Applications api:

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  

因此,我的环境没有改变。

于 2017-06-20T23:06:43.023 回答