如何在PHP中更改NLS_DATE_FORMAT

时间:2014-04-04 10:23:36

标签: php oracle pdo

如何使用PDO从Oracle数据库更改NLS_DATE_FORMAT。 到目前为止,我有这个:

    $date_set = "DD-MM-YYYY HH24:MI:SS";
    $query = $this->conn->prepare("ALTER SESSION SET 'NLS_DATE_FORMAT' = ?");
    $query->execute(array($date_set));

但是当我尝试获取会话时:

    $query = "select * from nls_session_parameters where parameter='NLS_DATE_FORMAT'";
    $parameters = array();
    $test = $this->fetchRow($query, $parameters);
    var_dump($test); exit();

它返回:

DD-MON-RR"

3 个答案:

答案 0 :(得分:1)

此查询:

ALTER SESSION SET 'NLS_DATE_FORMAT' = 'DD-MM-YYYY HH24:MI:SS'

...应该触发此错误:

  

ORA-00922:缺少或无效选项

如果您无法检测到它,则错误检查代码中存在问题。最有可能的是,you haven't configured PDO to throw exceptions

问题是NLS_DATE_FORMAT不是字符串而是标识符:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY HH24:MI:SS';

答案 1 :(得分:1)

在我的系统中,设置NLS_DATE_FORMAT没有任何效果,可能是因为我使用了oracle即时客户端。我的系统的解决方法是添加另一个alter session命令:

  ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY HH24:MI:SS';
  ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';

当设置NLS_DATE_FORMAT且未设置NLS_DATE_LANGUAGE并恢复为DD-MON-RR格式时,似乎OCI驱动程序感到困惑。

答案 2 :(得分:0)

使用PHP / PDO / Oracle时,您可以使用:

//change settings below
$username='user';
$password='mypassword';
$dbname='databasename';
$hostname='localhost';
$port='1521';
$sid='XE'; //could also be ORCL
$charset='WE8ISO8859P1'; //or UTF8 or whatever charset
$oraclelangauge='AMERICAN';

$tns = "(DESCRIPTION = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = ".$hostname.")(PORT = ".$port."))
      (CONNECT_DATA = (SID = ".$sid.")(SERVER = DEDICATED)))";

$dbDB = new PDO("oci:dbname=".$tns.";charset=".$charset, $username, $password);
$result = $dbDB->query("ALTER SESSION SET NLS_DATE_LANGUAGE = '".$oraclelanguage."'"); 

确保已启用 php_pdo_oci 扩展,并首先使用SQL Developer等其他Oracle客户端仔细检查Oracle连接设置。

首先检查ALTER SESSION SET NLS_DATE_LANGUAGE = <language>是否有效,对于您在Oracle客户端中设置的 $ oraclelanguage 设置。