ORACLE存储过程适用于sql开发人员,但不适用于php

时间:2016-06-23 13:19:21

标签: php oracle stored-procedures

我在这里遇到一个奇怪的问题,我尝试使用一个oracle存储过程,它在sqldeveloper和java上运行正常,但在php上没有。

我正在以这种方式执行查询:

//$rqt_date = "SELECT DECODE( 1, NULL, 1, 33, '1', 44 ) as test FROM DUAL";
$rqt_date = "SELECT DATEPARAM('23/06/2016') as date_1900 FROM DUAL";

$parsed = ociparse($db_link, $rqt_date);
oci_execute($parsed,OCI_NO_AUTO_COMMIT);
while (($row = oci_fetch_array($parsed, OCI_BOTH)) != false)
{
    print_r($row);
}

我使用评论$rqt_date(解码)进行测试:我得到了结果

Array
(
    [0] => 44
    [TEST] => 44
)

但是当我使用DATEPARAM时,我得到0作为值而不是42542(自1900年以来的天数):

Array
(
    [0] => 0
    [DATE_1900] => 0
)

我在sqldeveloper中获得了什么:

http://i.stack.imgur.com/6b40V.png

我在php日志中没有错误。

有关我服务器的信息: PHP版本5.3.8 系统Windows NT BOWSER 6.1 build 7601(Windows Server 2008 R2标准版Service Pack 1)i586

2 个答案:

答案 0 :(得分:0)

  

但是当我使用DATEPARAM时,我得到自1900年以来的天数

DATEPARAM函数应该非常简单:

CREATE FUNCTION dateparam (
  dt IN DATE
) RETURN INTEGER DETERMINISTIC
IS
BEGIN
  RETURN dt - DATE '1900-01-01';
END;
/

现在,这需要DATE数据类型(不是字符串)。

因此在PHP(不是我的语言,请原谅任何错误)中,您可以将所需的值作为绑定变量传递:

$rqt_date = "BEGIN :r := DATEPARAM( :dt ); END;";
$parsed = ociparse($db_link, $rqt_date);
oci_bind_by_name($parsed, ":dt", new DateTime( "2016-06-23" ) );
oci_bind_by_name($parsed, ":r", $r, 40 );
oci_execute($parsed,OCI_NO_AUTO_COMMIT);
print "$r\n";

答案 1 :(得分:0)

感谢您的回答。

以下是该功能的代码(它不是程序,你是对的)

create or replace function DateParam(strDate in varchar) return number DETERMINISTIC is
Result number := 0;
begin
If  Length (strDate) >=4 Then
    Result :=  to_date( strDate ) - to_date('01/01/1900');
End If;
return(Result);
exception
when others then
    return (0);
end DateParam;

它真的像你写的那个。

我尝试使用to_date(' 23/06/2016',' dd / mm / yyyy')而不是' 23/06 / 2016',它& #39; s仍然相同=> 0

BUUUUUT

使用您编写的功能正常工作!

所以我们改变了

to_date( strDate ) - to_date('01/01/1900');

从我们到

to_date( strDate, 'dd/MM/yyyy' ) - to_date('01/01/1900','dd/MM/yyyy');

现在它工作正常。

我不明白为什么它不能在php中工作(我们所做的所有修改都在函数本身,所以如果它在sqldeveloper中工作,它应该可以在任何地方工作吗?)...

非常感谢你们两位!