tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
793
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von desaster0505
    desaster0505 desaster0505 ist offline Mitglied Gold
    Registriert seit
    Dec 2006
    Ort
    Lampertheim
    Beiträge
    185
    Hall zusammen,

    bei unserer Webanwendung wurde eine Oracle-Datenbank durch eine IBM DB2 ersetzt.

    Nun hab ich ein PHP-Skript (nicht von mir) in dem folgender SQL-Befehl auf die DB2 angepasst werden muss. Ich weiss leider nicht wo und wie hier was geändert werden müsste. Hoffe es kann mir jemand weiterhelfen. Eine Fehlermeldung gibt es nicht, da diese abgefangen wird und eine Standard-Fehler-Nachricht ausgegeben wird ("Bitte wählen Sie....bla bla"). Es ist also keine Fehlernachricht vom PHP-Interpreter

    Hier der Code wo vermutlich der Fehler liegt:

    PHP-Code:
     for ($q=1$q<=$this->ospAmount$q++) { 
                            
    $sql_spr "SELECT PRIUPR,PRITOP FROM AML_IOP a,COM_PRI b 
                            WHERE a.IOPREFINTKEY = "
    .$this->ospObject[$this->opoAmount][$q]['OSPINTKEY'].
                            AND IOPREVACT = 999999999 AND PRIINTPIK = a.IOP_RF_PRIINTPIK AND PRIREVACT = 999999999"

                            
    $result_spr $this->db->query($sql_spr); 
                            if (!
    DB::isError($result_spr)) { 
                                
    $this->sprObject[$this->opoAmount][$q] = $result_spr->fetchRow(); 
                            } else { 
                                
    $errorText[] = amoss_text_10014.'<br>'
                            } 
                            
    $this->ospObject[$this->opoAmount][$q]['UPR'] = $this->sprObject[$this->opoAmount][$q]['PRIUPR']; 
                            
    $this->ospObject[$this->opoAmount][$q]['TOP'] = $this->sprObject[$this->opoAmount][$q]['PRITOP']; 
                        } 
    Hoffe, mir kann jemand weiterhelfen. Steh total auf dem Schlauch.
     
    Wenn euch mein Beitrag weiterhilft, bitte bewerten

  2. #2
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    Lass dir doch den SQL-Query mal ausgeben und gib ihn direkt in der Datenbank ein, dann sollte doch ein entsprechnder Fehler kommen.
     
    Die Schweine von heute sind unsere Schnitzel von morgen!

  3. #3
    Avatar von desaster0505
    desaster0505 desaster0505 ist offline Mitglied Gold
    Registriert seit
    Dec 2006
    Ort
    Lampertheim
    Beiträge
    185
    Hallo,

    kannst du mir sagen wie ich mir den SQL Query ausgeben lassen kann?
     
    Wenn euch mein Beitrag weiterhilft, bitte bewerten

  4. #4
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    Da ich die Datenbank-Klasse nicht kenne mit der gearbeitet wird, einfach ein "echo" mit dem Query einfügen:
    PHP-Code:
    for ($q=1$q<=$this->ospAmount$q++) {
        
    $sql_spr "SELECT PRIUPR,PRITOP FROM AML_IOP a,COM_PRI b
                            WHERE a.IOPREFINTKEY = "
    .$this->ospObject[$this->opoAmount][$q]['OSPINTKEY'].
                            AND IOPREVACT = 999999999 AND PRIINTPIK = a.IOP_RF_PRIINTPIK AND PRIREVACT = 999999999"


    // Ausgabe der Querys da in der Schleife
    echo $sql_spr '<br />';
     
        
    $result_spr $this->db->query($sql_spr);
        if (!
    DB::isError($result_spr)) {
            
    $this->sprObject[$this->opoAmount][$q] = $result_spr->fetchRow();
        } else {
            
    $errorText[] = amoss_text_10014.'<br>';
        }
        
    $this->ospObject[$this->opoAmount][$q]['UPR'] = $this->sprObject[$this->opoAmount][$q]['PRIUPR'];
        
    $this->ospObject[$this->opoAmount][$q]['TOP'] = $this->sprObject[$this->opoAmount][$q]['PRITOP'];

     
    Die Schweine von heute sind unsere Schnitzel von morgen!

  5. #5
    Avatar von desaster0505
    desaster0505 desaster0505 ist offline Mitglied Gold
    Registriert seit
    Dec 2006
    Ort
    Lampertheim
    Beiträge
    185
    Hallo,

    so ich hab mir den SQL-String ausgeben lassen und direkt auf die Datenbank angewendet. Und prompt erscheint der Fehler:

    Auf "(+" folgt ein unerwartetes Token ")".

    Der String ist:

    Code sql:
    1
    
    SELECT a.ORDINTKEY,a.ORDREVACT,a.ORDREVFIR,a.ORDREVTYP,a.ORDCCI, a.ORDIPO,a.ORD_RF_MFRCON,a.ORD_RF_MFRCUS,a.ORDPCY,a.ORDYORD,a.ORDYASC, a.ORDUNC,a.ORDSYS,a.ORD_RF_SUPSUS,a.ORDYSUSREC,a.ORDAMN,a.ORDMOI,a.ORDICR, a.ORDBNO,a.ORDQTL,a.ORDEVT,a.ORDTRU,a.ORDTRU_UNC,a.ORD_RF_ORDINTKEY,a.ORD_RF_ORDIPO, a.ORD_RF_CCOINTKEY,a.ORD_RF_CBUINTKEY,a.ORD_RF_SUPSUS_AGE,a.ORDYIPP,a.ORD_RF_QUOINTKEY, a.ORD_RF_MFRSTO,a.ORD_RF_MFRITO,a.ORDACK,a.ORDPCD,a.ORDYDGC,a.ORDR3KEYNO,a.ORDLASTAMN, a.ORDLOCKED,a.ORD_RF_UDCUDC,a.ORDRDD,a.ORDCDD,a.ORDFDD,a.ORDORIG,a.ORD_UC,a.ORD_LUPDATE, a.ORD_LUPTIME,a.ORD_LUPUSR,b.ORUORN FROM AMA_ORD a,AML_ORU b WHERE a.ORDREVACT = 999999999 AND a.ORDR3KEYNO IS NOT NULL AND b.ORUREVACT = 999999999 AND a.ORDINTKEY[B] (+) = [/B]b.ORUREFINTKEY AND UPPER(a.ORDR3KEYNO) LIKE UPPER('%4500057973%')

    Ich denke mal, dass er mit dem (+) nicht klar kommt. Aber da ich mich mit DB2 nicht auskenne, weiß ich nicht wodurch ich das ersetzen könnte? Weiss das jemand?
     
    Wenn euch mein Beitrag weiterhilft, bitte bewerten

  6. #6
    Avatar von desaster0505
    desaster0505 desaster0505 ist offline Mitglied Gold
    Registriert seit
    Dec 2006
    Ort
    Lampertheim
    Beiträge
    185
    Hat keiner eine Idee was ich daran anpassen muss? Brauche unbedingt Hilfe
     
    Wenn euch mein Beitrag weiterhilft, bitte bewerten

  7. #7
    Biber3 Biber3 ist offline Grünschnabel
    Registriert seit
    Jan 2007
    Beiträge
    2
    Moin disaster,

    DB2 kennt die (+)-Join-Syntaxvariante nicht.
    Die musst du in ein explizites LEFT JOIN/OUTER JOIN umwandeln ODER aber das angesprochene Feld in der WHERE-Clause auf "ist NULL oder gleich dem Feld in der anderen Tabelle" prüfen.

    In deinem Beispiel:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    SELECT a.ORDINTKEY
           , a.ORDREVACT
           , a.ORDREVFIR
           , a.ORDREVTYP
           , a.ORDCCI
           , a.ORDIPO
           , a.ORD_RF_MFRCON
           , a.ORD_RF_MFRCUS
           , a.ORDPCY
           , a.ORDYORD
           , a.ORDYASC
           , a.ORDUNC
           , a.ORDSYS
           , a.ORD_RF_SUPSUS
           , a.ORDYSUSREC
           , a.ORDAMN
           , a.ORDMOI
           , a.ORDICR
           ...      
          , b.ORUORN
    FROM AMA_ORD a
         , AML_ORU b
    WHERE a.ORDREVACT = 999999999
    AND   a.ORDR3KEYNO IS NOT NULL
    AND   b.ORUREVACT = 999999999
    AND   a.ORDINTKEY  (+) = b.ORUREFINTKEY
    AND   UPPER(a.ORDR3KEYNO) LIKE UPPER('%4500057973%');

    ...ist ja vermutlich gemeint, dass die beiden Tabellen a und b über "ORDREVACT=9999999999"eingeschränkt sind,
    in Tabelle a der ORDINTKEY gleich NULL oder aber gleich dem b.ORUREFINTKEY sein muss.

    Also eigentlich ein "RIGHT OUTER JOIN" von a auf b (alle Sätze aus b, wenn über b.ORUREFINTKEY und a.ORDINTKEY verknüpft wird.

    Muss eine grottige Performance bzw. eine bemerkenswerte Lasterzeugung bewirken

    P.S. Wer hat sich bei euch die Tabellenfeldnamen ausgedacht?
    Bis vorhin dachte ich, ich würde schon alle Abgründe der Datenmodellierung kennen...

    Grüße
    Biber
    Geändert von Biber3 (17.11.11 um 17:35 Uhr)
     

  8. #8
    Avatar von desaster0505
    desaster0505 desaster0505 ist offline Mitglied Gold
    Registriert seit
    Dec 2006
    Ort
    Lampertheim
    Beiträge
    185
    Hi Biber,

    viel Dank fürs erste für deine Antwort. Das Problem ist, dass ich mich mit DB2 nicht auskenne und bei SQLs mit Joins bisher wenig gemacht habe . Kannst du mir sagen, wie ich das (+) konkret ersetzen muss bzw. wie der SQL String dann aussehen muss? Sonst muss ich jetzt noch hingehen und schauen wie ich ein LEFT/RIGHT JOIN für eine DB2 bastele.

    Würdest mir damit sehr helfen.
     
    Wenn euch mein Beitrag weiterhilft, bitte bewerten

  9. #9
    Biber3 Biber3 ist offline Grünschnabel
    Registriert seit
    Jan 2007
    Beiträge
    2
    Moin desaster0505,

    da willst jetzt bestimmt nicht wirklich von mir hören, ich wäre ein klitzekleines bisschen skeptisch, ob du als Bei-JOINS-rechts-nicht-von-links-unterscheiden-Könner nun unbedingt die SQL-Statements von Oracle nach DB2 portieren solltest?

    Hab ich mir gedacht - von daher sprech ich das Thema lieber nicht an.
    Aber BTW - meine Töchter sind eigentlich immer interessiert an Nebenjobs nach der Schule - Kontakt könnte ich vermitteln.

    Wie im Vorkommentar geschrieben lese ich aus dem Statement einen RIGHT JOIN von Tabelle a auf b.

    --> das sieht allerdings insgesamt so dubios aus, dass ich es UNBEDINGT fachlich verifizieren würde

    Falls erstmal zur Pflichterfüllung eine "wortwörtliche Übersetzung" ausreicht, dann in etwa:

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    SELECT a.ORDINTKEY
           , a.ORDREVACT
           , a.ORDREVFIR
           , a.ORDREVTYP
           , a.ORDCCI
           , a.ORDIPO
           , a.ORD_RF_MFRCON
           , a.ORD_RF_MFRCUS
           , a.ORDPCY
           , a.ORDYORD
           , a.ORDYASC
           ...      
          , b.ORUORN
    FROM AMA_ORD a 
         RIGHT OUTER JOIN  AML_ORU b
                  ON a.ORDINTKEY  = b.ORUREFINTKEY
    WHERE a.ORDREVACT = 999999999
     AND   a.ORDR3KEYNO IS NOT NULL
     AND   b.ORUREVACT = 999999999
     --  über OUTER JOIN abgefackelt  --AND   a.ORDINTKEY  (+) = b.ORUREFINTKEY
     AND   UPPER(a.ORDR3KEYNO) LIKE UPPER('%4500057973%');

    Anmerkung:
    Gegen die "wortwörtliche Übersetzung" sprechen aus meiner Sicht auch die abstrusen WHERE-Bedingungen " AND a.ORDR3KEYNO IS NOT NULL ... AND UPPER(a.ORDR3KEYNO) LIKE UPPER('%4500057973%')"

    -- > so ein Gestrunkele ohne fachliche Begründung würde ich eher NICHT produktiv setzen.

    Gibt es denn keinerlei Doku für diese usecases?

    Grüße
    Biber
     

Ähnliche Themen

  1. Update-Befehl auf Oracle-Datenbank
    Von kallkar im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 15.01.11, 14:40
  2. ORACLE SQL Befehl Probleme mit GROUP BY
    Von mafin im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 02.02.09, 14:51
  3. Oracle PL/SQL Daten von Insert Befehl kriegen?
    Von Finalplayer_Ryu im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 30.09.08, 20:01
  4. [ORACLE] MySQL-Script für ORACLE anpassen
    Von Sirakov im Forum Relationale Datenbanksysteme
    Antworten: 6
    Letzter Beitrag: 02.04.07, 09:38
  5. Oracle Datenbank
    Von riddler2kone im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 06.03.02, 09:54

Stichworte