如果在oracle函数中,为什么oci_bind_by_name不起作用

问题描述 投票:0回答:1

对不起,我的英语不好。我认为将代码放在这里会更容易。所以这是我尝试过的:

//这正在工作

$sql = "select ID, NAME, BDATE from EMPLOYEES where BDATE >= DATE '2020-01-01'"; 

//但是当我尝试这样做时,它失败:

$sql = "select ID, NAME, BDATE from EMPLOYEES where BDATE >= DATE :bdate"; //this is 
$compiled = oci_parse($conn, $sql);
oci_bind_by_name($compiled, ":bdate", "2020-01-01");

以上将引发此错误:

“代码”:936,“消息”:“ ORA-00936:缺少表达式”

我尝试过其他类似的东西:

//失败

$sql = "select ID, NAME, BDATE from EMPLOYEES where BDATE >= TO_DATE(:bdate, 'YYYY-MM-DD')"; 

以上将引发此错误:

“代码”:1847,“消息”:“ ORA-01847:月份中的日期必须在1到1之间一个月的最后一天“

//当我放入DATE,TO_DATE,UPPER等函数时总是会失败

$sql = "select ID, NAME, BDATE, STATUS from EMPLOYEES where upper(STATUS) = upper(:status)"; 

// In子句中的事件也将失败

$sql = "select ID, NAME, BDATE, STATUS from EMPLOYEES where upper(STATUS) in (:status1, :status2)"; 
oci_bind_by_name($compiled, ":status1", "SINGLE");
oci_bind_by_name($compiled, ":status2", "MARRIED");

[请任何人告诉我如何解决此问题?我遵循了文档中的许多教程,以及另一个stackoverflow答案。但没有任何效果。

或者也许我错过了在Web服务器上设置的某些内容?还是在我的数据库服务器上?

Fyi,我正在使用PHP7.2,OCI8,Oracle 11g。

非常感谢。

php oracle oracle11g oci
1个回答
0
投票

这应该起作用:

where BDATE >= TO_DATE(:bdate, 'YYYY-MM-DD')

但仅当您以完全提供的日期值与您指定的格式相同:YYYY-MM-DD。您收到的错误:

ORA-01847:月份的日期必须在1到月份的最后一天之间

表示您提供了2020-18-05之类的东西,即“今天”,但格式为YYYY-DD-MM。正如Oracle期望的那样,YYYY-MM-DD并且我们的日历中没有18月,它引发了一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.