2017-06-20 67 views
0

我對PL/SQL相當陌生,在運行時遇到了一些麻煩。我試圖在兩個地方使用我的光標傳遞vendor_site_id。 (最終這個列表會更長,只是在開發中使用2個ID)試圖更新Oracle供應商站點彈性域。光標不能正常工作

該代碼是從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

它怎麼不起作用?我看到動態SQL的一代,但沒有看到它正在執行。 –

回答

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)值我選擇:

[email protected]>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應用程序的API到供應商的網站記錄:

[email protected]>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,我們所做的更新:

[email protected]>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   

因爲我沒有執行提交,我回滾我的更改,使記錄保持不變:

[email protected]>rollback; 

Rollback complete. 

[email protected]>SELECT 
    2  attribute1 
    3 FROM 
    4  apps.ap_supplier_sites_all 
    5 WHERE 
    6  vendor_site_id IN (
    7   812119,812118 
    8  ); 
ATTRIBUTE1 

因此,我的環境是不變的。

+0

非常感謝。作爲一個相對較新的人,我發現這非常有幫助。 – TMillz

+0

@TMillz如果這使您能夠執行和驗證您的plsql塊,請隨時接受答案,https://stackoverflow.com/help/someone-answers –