我是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;
答案 0 :(得分:0)
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
。
在我调用块之前,这里是与我使用SQLCl
选择的两个站点(均为NULL)相关联的值:
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
因此,我的环境没有改变。