难道从MySQL切换到Oracle吗?

时间:2009-08-14 03:12:55

标签: mysql database oracle

下面是我运行mysql查询的一些示例代码,我通过一个我认为可能会简化切换数据库的函数来运行它们。

下面是我运行的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;
}

5 个答案:

答案 0 :(得分:4)

如果您坚持使用纯非专有(ANSI)SQL,则无需修改任何查询。您可能正在使用专有扩展的示例是分页。如果你在你的网络应用程序中进行任何分页,很可能你正在使用这样的东西:

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

该查询对Oracle不起作用,因为limit是MySql的专有扩展,你必须使用Oracle的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),但还有其他人。

答案 1 :(得分:1)

首先,您希望能够切换数据库后端吗?它确实很少是一个必需的功能。

其次,如果您希望数据库运行良好,则不能坚持使用ANSII标准查询。数据库可以针对性能进行优化的几乎所有方式都是数据库供应商特定的。更好地学习如何正确使用你拥有的后端,而不是尝试使用它,这样你就可以随时切换到其他后端。

第三,Oracle的SQl版本与MySQL有很大不同,Oracle数据库的管理要复杂得多。除非我聘请了Oracle专家,否则我不会考虑支持它。

答案 2 :(得分:0)

“如果您的应用程序的可移植性是一个主要问题,您应该认真考虑使用一个允许您完全抽象出数据库供应商的库。”

对不起,我说这是个坏主意,完全没有解决任何问题。将您的依赖关系从某个特定的DBMS供应商转移到某个特定的库供应商/供应商。事实证明后者在IT领域比DBMS供应商更稳定,没有?

答案 3 :(得分:0)

Oracle确实有一个支持从MySQL迁移到Oracle的工具。它是their SQL Developer IDE的扩展。

答案 4 :(得分:0)

“但我们其他人应该将我们的应用程序塑造成他们当前运行的数据库。”

当我说“如果开发人员想要防范这些问题”时,我想我已经说过了。请注意第一个单词“IF”。

对于那些实际上没有费心去仔细阅读我的信息的人来说,还有很多不得不做的事情。