我在这里遇到一个奇怪的问题,我尝试使用一个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中获得了什么:
我在php日志中没有错误。
有关我服务器的信息: PHP版本5.3.8 系统Windows NT BOWSER 6.1 build 7601(Windows Server 2008 R2标准版Service Pack 1)i586
答案 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中工作,它应该可以在任何地方工作吗?)...
非常感谢你们两位!