2017-06-20 4 views
0

Je suis assez nouveau pour PL/SQL et j'ai de la difficulté à le faire fonctionner. J'essaye de passer le vendor_site_id à deux endroits en utilisant mon curseur. (Finalement, la liste sera plus, juste essayer de Dev avec 2 ID)Tentative de mise à jour des champs flexibles Oracle Site fournisseur. Le curseur ne fonctionne pas

Le code a été obtenu à partir d'Oracle, mais nous essayons de transmettre une mise à jour de masse pour ces flexfields.

Ici, il est:

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

Comment ça ne marche pas? Je vois la génération de SQL dynamique, mais ne le vois pas en cours d'exécution. –

Répondre

0

END LOOP besoin d'un Semicolon

Vous avez END LOOP --Cursor Loop

Il a besoin d'un point-virgule:

END LOOP; --Cursor Loop

Une fois que je modifie ce bloc PLSQL, j'identifier seulement deux supplier_site_id « s que je peux modifier au lieu de (1.631.833, 1.630.833). Bien sûr, exécutez ceci pour votre supplier_site_id.

Avec cette condition, vous avez le mauvais type de données pour supplier_site_id. Il est de type, NUMBER, et non VARCHAR2. Je m'attendrais à ce que la base de données renvoie dynamiquement ces VARCHAR2 à NUMBER pendant l'exécution.

Avant que j'invoque le bloc, sont des valeurs associées à deux sites que j'ai cueillies (à la fois NULL) en utilisant SQLCl:

[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 

Ensuite, j'invoque le bloc plsql qui appelle Oracle Applications api associés à l'exécution des mises à jour les dossiers du site du vendeur:

[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. 

Ensuite, je vérifie ces documents pour voir les mises à jour que nous venons de faire en appelant le site fournisseur mise à jour 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   

Depuis que je ne pas effectuer une livraison, je rollback mes changements de quitter les dossiers inchangés:

[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 

Ainsi, mon environnement est inchangé.

+0

merci beaucoup. Comme quelqu'un qui est relativement nouveau à ce sujet, j'ai trouvé cela incroyablement utile. – TMillz

+0

@TMillz Si cela vous a permis d'exécuter et de valider votre bloc plsql, n'hésitez pas à accepter la réponse, https://stackoverflow.com/help/someone-answers –