Sql 正在尝试更新Oracle供应商站点flexfields。光标不工作

Sql 正在尝试更新Oracle供应商站点flexfields。光标不工作,sql,oracle,plsql,oracle-apps,oracle-ebs,Sql,Oracle,Plsql,Oracle Apps,Oracle Ebs,我对PL/SQL非常陌生,在运行它时遇到了一些问题。我试图使用光标在两个位置传递供应商站点id。最终列表会更长,只需使用2个ID在Dev中进行尝试 代码是从Oracle获得的,但是我们正试图通过这些flexfields的大规模更新 这是: SET SERVEROUTPUT ON DECLARE lc_return_status VARCHAR2(2000); ln_msg_count NUMBER; ll_msg_da

我对PL/SQL非常陌生,在运行它时遇到了一些问题。我试图使用光标在两个位置传递供应商站点id。最终列表会更长,只需使用2个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;
结束循环需要分号

你有 结束循环-光标循环

它需要一个分号:

端环-光标循环

一旦我修改了这个plsql块,我就可以识别两个供应商站点id,我可以修改它们来代替1631833、1630833。当然,为您的供应商站点id执行此操作

在这种情况下,供应商站点id的数据类型错误。它的类型、编号不是VARCHAR2。我希望数据库在执行期间将这些VARCHAR2动态转换回NUMBER

在调用块之前,以下是与我使用SQLCl选择的两个站点相关的值,它们都为NULL:

接下来,我调用plsql块,该块调用与执行供应商站点记录更新相关联的Oracle应用程序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.
因为我没有执行提交,所以我回滚更改以保持记录不变:

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  

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

它怎么不工作?我看到动态sql的生成,但没有看到它被执行。非常感谢。作为一个对此比较陌生的人,我发现这非常有用。@TMillz如果这使您能够执行和验证plsql块,请随意接受答案,
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