2009-08-14 41 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”。

对于另一个人来说,我们有很大的责任感,他们实际上并没有仔细阅读我的消息。