2009-08-14 48 views
4

下面是我如何運行我的mysql查詢的一些示例代碼,我通過一個函數運行它們,我認爲它可以簡化切換數據庫。難以從MySQL切換到Oracle嗎?

下面是我運行的一個mysql查詢的例子,下面是實際的函數。

如果我決定使用此設置,是否很難更改爲不同的數據庫類型,如oracle或其他數據庫?

只能修改該功能,還是需要更改每個頁面上的查詢?

$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; 
} 

回答

4

如果您堅持純粹的非專有(ANSI)SQL,您將不必修改任何查詢。您可能會使用專有擴展的示例是分頁。如果你在你的web應用程序中做任何分頁它極有可能是你使用的是這樣的:

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

該查詢將不會在甲骨文工作,因爲limit是一個專有擴展到MySQL,你必須使用去約分頁甲骨文rownum(只能取一個參數),所以基本上你將不得不重寫你的分頁查詢,看起來像這樣:

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; 

還要考慮您要使用的一個Oracle的擴展,所以你的數據庫連接,操作和錯誤處理代碼將必須是改寫過 (example from the oci8 extension docs),並會看起來更像:

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"; 
    } 

因此,大家可以看到這是非同小可的壯舉,特別是沒有,如果你有一大堆的MySQL硬代碼。

如果您的應用程序的可移植性是一個主要問題,那麼您應該認真考慮使用一個庫,它允許您完全抽象出數據庫供應商。我使用Zend_Db(偶然支持Oracle),但也有其他的。

+0

感謝,它看起來更難,然後我曾想過,也許看着支持多個數據庫的軟件將是一個可以研究的地方 – JasonDavis 2009-08-14 11:57:05

0

「如果你的應用程序的可移植性是一個主要問題,你應該認真考慮使用一個庫,它允許你完全抽象出數據庫供應商。」

對不起,我說這是一個壞主意,根本不能解決任何問題。將您的依賴從一些特定的DBMS供應商轉移到某個特定的庫供應商/供應商上。後者已經被證明是IT環境中比DBMS供應商更穩定的因素,不是嗎?

+0

+1非常贊同! – 2009-08-14 11:46:11

+1

@Erwin Smout - 很好,你不同意我的最後一點,但你對OP問題的回答究竟是什麼? – karim79 2009-08-14 14:57:59

1

首先,您爲什麼希望能夠切換數據庫後端?它確實很少是一個需要的功能。

其次,如果你想讓數據庫運行良好,你不能堅持ANSII標準查詢。幾乎所有的數據庫都可以針對性能進行優化的方式是數據庫供應商特定的。學習如何正確使用後端的方法要比試圖做到這一點更好,以便您可以隨時切換到其他後端。

第三,Oracle的SQl版本與MySQL有很大不同,Oracle數據庫的管理要複雜得多。除非我僱用了Oracle專家,否則我不會考慮支持它。

+0

我只是在研究這個想法,你能解釋一下什麼是「ANSII標準查詢」的意思,我試着用Google搜索它,我不熟悉這個術語但什麼都沒發現 – JasonDavis 2009-08-14 14:31:18

+0

有一個ANSII標準的SQL(谷歌ANSI標準sql ),這應該被大多數數據庫使用。理論上這意味着ANSII標準查詢可以被任何使用SQL的數據庫使用。在實踐中,不是那麼多。數據庫提供者傾向於用自己的實現來擴展標準,這些實現考慮了他們的底層架構,因此通常是比標準更快地完成同樣事情的方法。 – HLGEM 2009-08-14 14:58:57

+0

好吧,我感謝信息,我想也許ANSII標準是一件壞事,但我想這不是 – JasonDavis 2009-08-14 15:07:39

0

「但我們其他人應該將我們的應用程序塑造到他們當前運行的數據庫中。」

我想當我說「如果一個開發人員想要防範自己對這些問題」。請注意第一個單詞「IF」。

對於另一個人來說,我們有很大的責任感,他們實際上並沒有仔細閱讀我的消息。