2009-08-14 11 views
4

Im Folgenden finden Sie einen Beispielcode, wie ich meine mysql-Abfragen ausführen kann. Ich führe sie durch eine Funktion, von der ich denke, dass sie den Wechsel von Datenbanken vereinfacht.Wäre es schwierig, von MySQL zu Oracle zu wechseln?

Unten ist ein Beispiel für eine MySQL-Abfrage, die ich ausführen und darunter ist die eigentliche Funktion.

Wäre es schwierig, auf einen anderen Datenbanktyp wie Orakel oder etwas anderes zu wechseln, wenn ich mich jemals für dieses Setup entscheiden würde?

Wäre in der Lage, nur die Funktion zu ändern oder müsste ich die Abfragen ändern, die auf jeder Seite sind?

$sql_photo = "select * from friend_user_photo where userid='$user_id' and defaultphoto='yes' order by auto_id desc"; 
$result_photo = executeQuery($sql_photo); 

function executeQuery($sql) { 
    $result = mysql_query_2($sql); 
    if(mysql_error()){ 
     $error = '<BR><center><font size="+1" face="arial" color="red">An Internal Error has Occured.<BR> The error has been recorded for review</font></center><br>'; 
     // If admin is viewing then we show the query code and the error returned 
     if($_SESSION['auto_id'] == 1){ 
      $sql_formatted = highlight_string(stripslashes($sql), true); 
      $error .= '<b>The MySQL Syntax Used</b><br>' . $sql_formatted . '<br><br><b>The MySQL Error Returned</b><br>' . mysql_error() ; 
     } 
     die($error); 
    } 
    return $result; 
} 

Antwort

4

Wenn Sie bei ANSI-SQL bleiben, müssen Sie keine Abfragen ändern. Ein Beispiel dafür, wo Sie proprietäre Erweiterungen verwenden könnten, ist die Paginierung. Wenn Sie irgendeine Paginierung innerhalb Ihrer Web-Anwendung tun ist es sehr wahrscheinlich, dass Sie so etwas wie dieses verwenden:

select id, name, created from thing limit(0,20) 

Diese Abfrage wird nicht auf Oracle arbeiten, da limit eine proprietäre Erweiterung MySql ist, Sie würde über die Paginierung gehen mit Oracle rownum (die nur ein Argument nehmen kann), so im wesentlichen werden Sie Ihre Paginierung Abfragen umschreiben müssen wie folgt aussehen:

select * 
    from (select /*+ FIRST_ROWS(n) */ 
    a.*, ROWNUM rnum 
     from (your_query_goes_here, 
     with order by) a 
     where ROWNUM <= 
     :MAX_ROW_TO_FETCH) 
where rnum >= :MIN_ROW_TO_FETCH; 

Beachten Sie auch, dass Sie eines verwenden werden die Oracle-Erweiterungen, so müssen Ihre Datenbankverbindung, Manipulation und Fehlerbehandlung Code sein neu geschrieben zu (example from the oci8 extension docs) und wird mehr wie folgt aussehen:

if ($c = oci_connect("hr", "hr_password", "localhost/XE")) { 
    echo "Successfully connected to Oracle."; 
    oci_close($c); 
} else { 
    $err = oci_error(); 
    echo "Oracle Connect Error " . $err['text']; 
} 
    // Select Data... 
    $s = oci_parse($c, "select * from tab1"); 
    oci_execute($s, OCI_DEFAULT); 
    while (oci_fetch($s)) { 
    echo "COL1 = " . oci_result($s, "COL1") . 
     ", COL2 = " . oci_result($s, "COL2") . "<br>\n"; 
    } 

So wie Sie es ist keine triviale Leistung sehen können, vor allem nicht, wenn man Tonnen von MySql-festverdrahtet Code.

Wenn die Portabilität Ihrer Anwendung ein wichtiges Anliegen ist, sollten Sie ernsthaft in Betracht ziehen, eine Bibliothek zu verwenden, mit der Sie den Datenbankanbieter insgesamt abstrahieren können. Ich benutze Zend_Db (die übrigens unterstützt Oracle), aber es gibt andere da draußen.

+0

danke, es sieht viel schwieriger aus, als ich gedacht habe, vielleicht mit Blick auf Software, die mehrere DBs unterstützt, wäre ein Ort, um auch zu forschen – JasonDavis

0

"Wenn die Portabilität Ihrer Anwendung ein Hauptanliegen ist, sollten Sie ernsthaft in Betracht ziehen, eine Bibliothek zu verwenden, mit der Sie den Datenbankanbieter insgesamt abstrahieren können."

Sorry, ich sage, das ist eine schlechte Idee, die überhaupt nichts löst. Verlagern Sie Ihre Abhängigkeiten von einem bestimmten DBMS-Anbieter zu einem bestimmten Bibliotheksanbieter. Letztere haben sich in der IT-Landschaft als wesentlich stabiler erwiesen als die DBMS-Anbieter, oder?

+0

+1 Konnte nicht mehr zustimmen! –

+1

@Erwin Smout - gut, Sie sind nicht einverstanden mit meinem letzten Punkt, aber was genau ist Ihre Antwort auf die Frage des OP? – karim79

1

Zuerst, warum möchten Sie Datenbank-Back-Ends wechseln können? Es ist wirklich selten ein benötigtes Merkmal.

Zweitens, wenn Sie möchten, dass Datenbanken gut funktionieren, können Sie nicht an ANSII Standardabfragen halten. Fast die gesamte Art und Weise, in der eine Datenbank für die Performance optimiert werden kann, ist vom Datenbankanbieter abhängig. Viel besser zu lernen, wie man das Backend richtig benutzt, als es zu versuchen, um es so zu machen, dass man jederzeit zu irgendeinem anderen Backend wechseln kann.

Drittens ist Oracles Version von SQl sehr verschieden von MySQL und die Verwaltung von Oracle-Datenbanken ist viel komplexer. Ich würde es nicht unterstützen, es sei denn, ich habe einen Oracle-Experten eingestellt.

+0

Ich bin gerade dabei, die Idee zu erforschen, können Sie ein wenig von dem, was "ANSII Standardabfragen" bedeutet, ich habe es googeln versucht, ich bin nicht vertraut mit dem Begriff, aber nichts gefunden – JasonDavis

+0

Es gibt einen ANSII-Standard für SQL (google ansi Standard sql), die von den meisten Datenbanken verwendet werden soll. In der Theorie bedeutet dies, dass ANSII-Standardabfragen von jeder Datenbank verwendet werden können, die SQL verwendet. In der Praxis nicht so sehr. Datenbankanbieter neigen dazu, den Standard mit ihren eigenen Implementierungen zu erweitern, die ihre zugrundeliegende Architektur berücksichtigen und daher oft schneller sind, dasselbe zu tun als der Standard. – HLGEM

+0

Ok ich danke für die Info, ich dachte, vielleicht ANSII Standard war eine schlechte Sache, aber ich denke, es ist nicht – JasonDavis

0

Oracle hat ein Tool, um die Migration von MySQL zu Oracle zu unterstützen. Es ist eine Erweiterung zu their SQL Developer IDE.

0

"Aber der Rest von uns sollte unsere Anwendungen an die Datenbank anpassen, auf der sie aktuell laufen."

Ich glaube, ich habe das angesprochen, als ich sagte "Wenn ein Entwickler sich vor solchen Problemen schützen will". Beachten Sie das allererste Wort "IF".

Viel verpflichtet für einen weiteren Downvote von jemandem, der tatsächlich nicht die Mühe hatte, meine Nachricht SORGFÄLTIG ZU LESEN.

Verwandte Themen