Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果在oracle函数中,为什么oci\u按\u名称绑定\u不起作用_Php_Oracle_Oracle11g_Oracle Call Interface - Fatal编程技术网

Php 如果在oracle函数中,为什么oci\u按\u名称绑定\u不起作用

Php 如果在oracle函数中,为什么oci\u按\u名称绑定\u不起作用,php,oracle,oracle11g,oracle-call-interface,Php,Oracle,Oracle11g,Oracle Call Interface,对不起,我的英语不好。我想如果我把代码放在这里会容易些。以下是我尝试过的: //这是有效的 $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 =

对不起,我的英语不好。我想如果我把代码放在这里会容易些。以下是我尝试过的:

//这是有效的

$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')"; 
oci_bind_by_name($conn, ':bdate', '2020-01-01');
以上内容将引发此错误:

“代码”:1847,“消息”:“ORA-01847:月日必须介于1和 每月最后一天“

//当我将DATE、TO_DATE、UPPER等函数放入内部时总是失败

$sql = "select ID, NAME, BDATE, STATUS from EMPLOYEES where upper(STATUS) = upper(:status)"; 
//第条中的事件也将失败

$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答案。但什么都不管用

或者是我的网络服务器上没有设置什么东西?还是在我的数据库服务器上

仅供参考,我正在使用PHP7.2、OCI8和Oracle 11g

非常感谢。

这应该可以:

where BDATE >= TO_DATE(:bdate, 'YYYY-MM-DD')
但前提是您提供的日期值与指定的格式完全相同:
YYYY-MM-DD
。您得到的错误:

ORA-01847:月份的日期必须介于1和月份的最后一天之间

表示您提供了一个无效字符串,例如,
2020-05-38
-任何月份都没有38天,Oracle希望数字介于1和31之间(因为5月份有31天)


使用检查默认日期格式

SQL> select * From nls_session_parameters where parameter = 'NLS_DATE_FORMAT';

PARAMETER            VALUE
-------------------- --------------------
NLS_DATE_FORMAT      DD.MM.RR

SQL>
这意味着,在我的数据库中,您将今天日期的值传递为
18.05.20

这应该可以:

where BDATE >= TO_DATE(:bdate, 'YYYY-MM-DD')
但前提是您提供的日期值与指定的格式完全相同:
YYYY-MM-DD
。您得到的错误:

ORA-01847:月份的日期必须介于1和月份的最后一天之间

表示您提供了一个无效字符串,例如,
2020-05-38
-任何月份都没有38天,Oracle希望数字介于1和31之间(因为5月份有31天)


使用检查默认日期格式

SQL> select * From nls_session_parameters where parameter = 'NLS_DATE_FORMAT';

PARAMETER            VALUE
-------------------- --------------------
NLS_DATE_FORMAT      DD.MM.RR

SQL>

这意味着,在我的数据库中,您可以将今天日期的值传递为
18.05.20

这对我在PHP7.4、Oci8/Oracle 19c数据库上的工作很有效。(我从来没有在php上工作过,只是在谷歌上到处搜索)

Edit:-IN子句也适用于我。这是我学到的,在OCI\U BIND I中不能传递文本值,首先将文本赋值给变量

$sql = "SELECT ename FROM emp WHERE job IN (:job1,:job2)";
$stid = oci_parse($conn, $sql);
$job1 ='CLERK';
$job2 = 'SALESMAN';
oci_bind_by_name($stid,':job1', $job1);
oci_bind_by_name($stid,':job2',$job2);
oci_execute($stid);

检查一下这些例子,看看它们是否适用于Oracle数据库这对我在PHP7.4、Oci8/Oracle 19c数据库上的工作是有效的(我从来没有在php上工作过,只是到处搜索)

Edit:-IN子句也适用于我。这是我学到的,在OCI\U BIND I中不能传递文本值,首先将文本赋值给变量

$sql = "SELECT ename FROM emp WHERE job IN (:job1,:job2)";
$stid = oci_parse($conn, $sql);
$job1 ='CLERK';
$job2 = 'SALESMAN';
oci_bind_by_name($stid,':job1', $job1);
oci_bind_by_name($stid,':job2',$job2);
oci_execute($stid);

检查这些示例,以了解适用于Oracle数据库的示例

日期“2020-01-01”
是ANSI语法。这是一种在代码中键入原始日期的机制,对于变量或占位符没有意义,因此会出现错误


如前所述,您可以使用作为替代。

日期“2020-01-01”
是ANSI语法。这是一种在代码中键入原始日期的机制,对于变量或占位符没有意义,因此会出现错误


如前所述,您可以使用作为备选方案。

不确定,但请尝试在变量中设置值-
$date=“2020-01-01”
然后将变量按名称($compiled,“:bdate”,$date)放入bind
oci\u bind\u中谢谢。我已经做到了。我直接将它放入oci\u bind\u中,不使用变量。像这样:oci按名称绑定($conn,,:bdate,,'2020-01-01');不确定,但请尝试在变量中设置值-
$date=“2020-01-01”
然后将变量按名称($compiled,“:bdate”,$date)放入bind
oci\u bind\u中谢谢。我已经做到了。我直接将它放入oci\u bind\u中,不使用变量。像这样:oci按名称绑定($conn,,:bdate,,'2020-01-01');谢谢你,但实际上我通过了'2020-01-01'的价值。但不知怎的,它引起了这个错误;固定的。就你传递的价值而言:这不应该发生;每个月都有“01”天,所以。。。也许这与您使用的环境有关(PHP7.2、OCI8、Oracle 11g)。请参见数据库中的默认NLS设置和日期格式。然后尝试使用该格式的日期。我编辑了我的消息并添加了您可能使用的查询。我的NLS_DATE_FORMAT=DD-MON-RR我已经尝试过:oci_bind_by_DATE($conn,“:end_DATE”,'01-JAN-2020');它会引发此错误:“代码”:936,“消息”:“ORA-00936:缺少表达式”我怀疑服务器设置中缺少某些内容。可能。。。我不懂PHP,所以帮不了什么忙。在谷歌上到处搜索会提到一些类似于日期(“d-M-Y H:i:s”)
的东西,那么-也许日期(“01-01-20”)
会有帮助吗?如果没有,恐怕我没有其他想法。谢谢你,但实际上我通过了'2020-01-01'的价值。但不知怎的,它引起了这个错误;固定的。就你传递的价值而言:这不应该发生;每个月都有“01”天,所以。。。也许这与您使用的环境有关(PHP7.2、OCI8、Oracle 11g)。请参见数据库中的默认NLS设置和日期格式。然后尝试使用该格式的日期。我编辑了我的消息并添加了您可能使用的查询。我的NLS_DATE_FORMAT=DD-MON-RR我已经尝试过:oci_bind_by_DATE($conn,“:end_DATE”,'01-JAN-2020');它会引发此错误:“代码”:936,“消息”:“ORA-00936:缺少表达式”我怀疑服务器设置中缺少某些内容。可能。。。我不懂PHP,所以帮不了什么忙。在谷歌上到处搜索会提到一些类似于日期(“d-M-Y H:i:s”)的东西,那么-也许日期(“01-01-20”)会有帮助吗?如果没有,恐怕我没有其他想法。谢谢你提到这是一个日期文字语法。我不知道。我经常使用它,因为它很有效:)。我将使用带有变量的TO_DATE函数重试