2017-05-27 5 views
0

Ich muss Änderungen an einem SP machen, die eine Reihe von komplexen XML-Funktionen hat und was nichtVerständnis komplexer SP in DB2

Declare ResultCsr2 Cursor For 
     WITH 
     MDI_BOM_COMP(PROD_ID,SITE_ID, xml) AS (
     SELECT TC401F.T41PID,TC401F.T41SID, 
     XMLSERIALIZE(
     XMLAGG(
      XMLELEMENT(NAME "MDI_BOM_COMP", 
      XMLFOREST(
        trim(TC401F.T41CTY) AS COMPONENT_TYPE, 
        TC401F.T41LNO AS COMP_NUM, 
        trim(TC401F.T41CTO) AS CTRY_OF_ORIGIN, 
        trim(TC401F.T41DSC) AS DESCRIPTION, 
        TC401F.T41EFR AS EFFECTIVE_FROM, 
        TC401F.T41EFT AS EFFECTIVE_TO, 
        trim(TC401F.T41MID) AS MANUFACTURER_ID, 
        trim(TC401F.T41MOC) AS MANUFACTURER_ORG_CODE, 
        trim(TC401F.T41CNO) AS PROD_ID, 
        trim(TC401F.T41POC) AS PROD_ORG_CODE, 
        TC401F.T41QPR AS QTY_PER, 
        trim(TC401F.T41SBI) AS SUB_BOM_ID, 
        trim(TC401F.T41SBO) AS SUB_BOM_ORG_CODE,  --ADB01 
        trim(TC401F.T41VID) AS SUPPLIER_ID, 
        trim(TC401F.T41SOC) AS SUPPLIER_ORG_CODE, 
        TC401F.T41UCT AS UNIT_COST 
       ) 
      ) 
      ) AS CLOB(1M) 
      ) 
      FROM TC401F TC401F 
      GROUP BY T41PID,T41SID 
      ) 

     SELECT 
     RowNum, '<BOM_INBOUND>' || 
     XMLSERIALIZE (
     XMLELEMENT(NAME "INTEGRATION_MESSAGE_CONTROL", 
      XMLFOREST(
        'FULL_UPDATE' as ACTION, 
        'POLARIS' as COMPANY_CODE, 
        TRIM(TC400F.T40OCD) as ORG_CODE, 
        '5' as PRIORITY, 
        'INBOUND_ENTITY_INTEGRATION' as MESSAGE_TYPE, 
        'POLARIS_INTEGRATION' as USERID, 
        'TA' as RECEIVER, 
        HEX(Generate_Unique()) as SOURCE_SYSTEM_TOKEN 
        ), 
         XMLELEMENT(NAME "BUS_KEY", 
         XMLFOREST(
         TRIM(TC400F.T40BID) as BOM_ID, 
         TRIM(TC400F.T40OCD) as ORG_CODE 
         ) 
        ) 
        ) AS VARCHAR(1000) 
        ) 
      || '<MDI_BOM>' || 
       XMLSERIALIZE (
       XMLFOREST(

       TRIM(TC400F.T40ATP) AS ASSEMBLY_TYPE, 
       TRIM(TC400F.T40BID) AS BOM_ID, 
       TRIM(TC400F.T40CCD) AS CURRENCY_CODE, 
       TC400F.T40DPC AS DIRECT_PROCESSING_COST, 
       TC400F.T40EFD AS EFFECTIVE_FROM, 
       TC400F.T40EFT AS EFFECTIVE_TO, 
       TRIM(TC400F.T40MID) AS MANUFACTURER_ID, 
       TRIM(TC400F.T40MOC) AS MANUFACTURER_ORG_CODE, 
       TRIM(TC400F.T40OCD) AS ORG_CODE, 
       TRIM(TC400F.T40PRF) AS PROD_FAMILY, 
       TRIM(TC400F.T40PID) AS PROD_ID, 
       TRIM(TC400F.T40POC) AS PROD_ORG_CODE, 
       TRIM(TC400F.T40ISA) AS IS_ACTIVE, 
       TRIM(TC400F.T40VID) AS SUPPLIER_ID, 
       TRIM(TC400F.T40SOC) AS SUPPLIER_ORG_CODE, 
       TRIM(TC400F.T40PSF) AS PROD_SUB_FAMILY, 
       CASE TRIM(TC400F.T40PML) 
        WHEN '' THEN TRIM(TC400F.T40PML) 
        ELSE TRIM(TC400F.T40PML) || '~' || TRIM(TC403F.T43MDD) 
        END AS PROD_MODEL 

       ) AS VARCHAR(3000) 
       ) 
      || IFNULL(MBC.xml, '') || 
       XMLSERIALIZE (
       XMLFOREST(
        XMLFOREST(
        TRIM(TC400F.T40CCD) AS CURRENCY_CODE, 
        TC400F.T40PRI AS PRICE, 
        TRIM(TC400F.T40PTY) AS PRICE_TYPE 
         ) AS MDI_BOM_PRICE, 
        XMLFOREST(
         TRIM(TC400F.T40CCD) AS CURRENCY_CODE, 
         TRIM(TC400F.T40PRI) AS PRICE, 
         'TRANSACTION_VALUE' AS PRICE_TYPE 
        ) AS MDI_BOM_PRICE, 
        XMLFOREST(
         TRIM(TC400F.T40INA) AS INCLUDE_IN_AVERAGING 

         ) AS MDI_BOM_IMPL_BOM_PROD_FAMILY_AUTOMOBILES 

        ) AS VARCHAR(3000) 
        ) 
        || '</MDI_BOM>' || 
        '</BOM_INBOUND>' XML 
        FROM (
          SELECT 
          ROW_NUMBER() OVER (
            ORDER BY T40STS 
            ,T40SID 
            ,T40BID 
          ) AS RowNum 
          ,t.* 
          FROM TC400F t 
        ) TC400F 

        LEFT OUTER JOIN MDI_BOM_COMP MBC 
        ON TC400F.T40SID = MBC.SITE_ID 
        AND TC400F.T40PID = MBC.PROD_ID 
        LEFT OUTER JOIN TC403F TC403F 
         ON TC400F.T40PML <> '' 
         AND TC400F.T40PML = TC403F.T43MDL 
        WHERE TC400F.T40STS = '10' 
         AND TC400F.RowNUM BETWEEN 
         (P_STARTROW + (P_PAGENOS - 1) * P_NBROFRCDS) 
         AND (P_STARTROW + (P_PAGENOS - 1) * P_NBROFRCDS + 
           P_NBROFRCDS - 1); 

oben Gegeben ist ein Cursor-Deklaration in der SP-Code, die ich kämpfen werde zu verstehen . Das allererste WITH selbst scheint geheimnisvoll zu sein. Ich habe es zusammen mit temporären Tabellennamen verwendet, aber dies ist das erste Mal, dass ich etwas von dieser Art sehe, das ein SP oder UDF zu sein scheint? Kann mir bitte jemand erklären, wie ich all das verstehen und verstehen kann?

auf die Frage Hinzufügen von weiteren, hier die tatsächliche Anforderung ist, die Daten im XML so arrangieren, dass die Datensätze, die TC401F.T41SBI Gebiet besiedelten sollte am Anfang der XML-Ausgabe erscheinen haben ..

Dieses Feld wird wie folgt im folgenden Code ausgewählt:

trim(TC401F.T41SBI) AS SUB_BOM_ID. Wenn dieses Feld nicht leer ist, sollte dies zuerst in der XML-Datei angezeigt werden und alle Datensätze mit diesem Feldwert Blank sollten erst danach erscheinen. Was wäre der beste Ansatz dafür? Die Verwendung von ORDER BY in irgendeiner Weise scheint nicht wirklich hilfreich zu sein, da das XML tatsächlich durch einige Funktionen erzeugt wird und die Reihenfolge, durch die es funktioniert, keinen Einfluss darauf hat, wie die Elemente in der XML angeordnet sind. Ein Ansatz, den ich mir vorstellen konnte, war die Verwendung einer Where-Klausel, wo zuerst TC401F.T41SBI <> '' dann die Datensätze anhängen, wo TC401F.T41SBI = ''

+0

Bitte entstellen Sie Ihre Frage nicht, wenn Sie es nicht mögen zu bleiben, löschen Sie Ihre Antwort und die Frage, aber berücksichtigen Sie die Benutzer, die Zeit genommen haben, um sie zu beantworten . –

Antwort

0

Ich denke, dass ich die Antwort für meine Anforderung gefunden.Ich musste eine Reihenfolge nach Feldname nach XMLELEMENT Funktion hinzufügen

+0

Dies beantwortet etwas völlig anderes als die ursprüngliche Frage. Seien Sie vorsichtig, wenn Sie dies in anderen Tags tun, es gibt Leute hier in der Nähe, die Sie dafür ablehnen, und vielleicht sogar abstimmen, um zu schließen oder zu löschen. – jmarkmurphy

0

Beste kann ich tun, ist mit dem CTE helfen.

WITH 
    MDI_BOM_COMP(PROD_ID,SITE_ID, xml) AS (
    SELECT TC401F.T41PID,TC401F.T41SID, 

Dies erzeugt nur eine Tabelle mit dem Namen MDI_BOM_COMP mit drei Spalten namens PROD_ID, SITE_ID und XML. Die Tabelle enthält einen Datensatz für jede PROD_ID, SITE_ID, und der Inhalt von XML ist ein XML-Snippet mit allen Komponenten für dieses Produkt und diese Site.

Jetzt kann der XML-Teil ein wenig verwirrend sein, aber wenn wir ihn in seine skalaren und aggregierten Komponenten aufteilen, können wir es ein wenig verständlicher machen.

Zuerst ignorieren Sie die Gruppierung. Daher ruft der CTE jede Zeile in TC401F ab. XMLELEMENT und XMLFORREST sind Skalarfunktionen. XMLELEMENT erstellt ein einzelnes XML-Element Das Tag ist der erste Parameter und der Inhalt des Elements ist der zweite im obigen Beispiel. XMLFORREST ist wie eine Reihe von XMLELEMENT s miteinander verkettet.

XMLSERIALIZE(
    XMLAGG(
     XMLELEMENT(NAME "MDI_BOM_COMP", 
     XMLFOREST(
       trim(TC401F.T41CTY) AS COMPONENT_TYPE, 
       TC401F.T41LNO AS COMP_NUM, 
       trim(TC401F.T41CTO) AS CTRY_OF_ORIGIN, 
       trim(TC401F.T41DSC) AS DESCRIPTION, 
       TC401F.T41EFR AS EFFECTIVE_FROM, 
       TC401F.T41EFT AS EFFECTIVE_TO, 
       trim(TC401F.T41MID) AS MANUFACTURER_ID, 
       trim(TC401F.T41MOC) AS MANUFACTURER_ORG_CODE, 
       trim(TC401F.T41CNO) AS PROD_ID, 
       trim(TC401F.T41POC) AS PROD_ORG_CODE, 
       TC401F.T41QPR AS QTY_PER, 
       trim(TC401F.T41SBI) AS SUB_BOM_ID, 
       trim(TC401F.T41SBO) AS SUB_BOM_ORG_CODE,  --ADB01 
       trim(TC401F.T41VID) AS SUPPLIER_ID, 
       trim(TC401F.T41SOC) AS SUPPLIER_ORG_CODE, 
       TC401F.T41UCT AS UNIT_COST 
      ) 
     ) 
     ) AS CLOB(1M) 

im Beispiel also für jede Zeile in der Tabelle legt XMLFORREST eine Liste von XML-Elementen, jeweils ein für COMPONENT_TYPE, COMP_NUM, CTRY_OF_ORIGIN usw. Diese Elemente bilden den Inhalt eines anderen XML-Elements MDI_BOM_COMP welche wird erstellt von XMLELEMENT.

Jetzt haben wir für jede Zeile in der Tabelle PROD_ID, SITE_ID ausgewählt und einige XML erstellt. Als nächstes gruppieren wir uns nach PROD_ID und SITE_ID. Die Aggregationsfunktion XMLAGG wird alle XML für jede PROD_ID und sammeln und verketten.

Schließlich XMLSERIALIZE die interne XML-Darstellung mit dem String-Format konvertieren wir alle kennen und lieben;)

+0

Danke, das ist wirklich hilfreich..was ich nicht verstehe ist, wie alle Komponenten einer PROD_ID und SITE_ID abgerufen werden. Wie wird das möglich gemacht? Ist es durch die XMLAGGREGATE-Funktion? Es tut uns leid, dass XML in DB2 sehr neu ist. Also im Grunde wollen Sie verstehen, was jede der XML-Funktionen tun, die er tut. Ich ging durch die Dokumentation, aber es ist nicht Laie genug für mich zu verstehen –