Umstellung von Oracle auf DB2 Datenbank. SQL Befehl anpassen

desaster0505

Erfahrenes Mitglied
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:
 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.
 
Lass dir doch den SQL-Query mal ausgeben und gib ihn direkt in der Datenbank ein, dann sollte doch ein entsprechnder Fehler kommen.
 
Da ich die Datenbank-Klasse nicht kenne mit der gearbeitet wird, einfach ein "echo" mit dem Query einfügen:
PHP:
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'];
}
 
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:

SQL:
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.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?
 
Zuletzt bearbeitet von einem Moderator:
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:
SQL:
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
 
Zuletzt bearbeitet:
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.
 
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:

SQL:
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
 
Zurück