首页 > 解决方案 > 如果在 oracle 函数内部,为什么 oci_bind_by_name 不起作用

问题描述

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

//这是工作

$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");

以上将引发此错误:

"code":936,"message":"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');

以上将引发此错误:

"code":1847,"message":"ORA-01847: 日期必须介于 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 答案。但没有任何效果。

还是我错过了在我的网络服务器上设置的东西?或在我的数据库服务器上?

仅供参考,我使用的是 PHP7.2、OCI8、Oracle 11g。

非常感谢您。

标签: phporacleoracle11goracle-call-interface

解决方案


这在 php 7.4、Oci8/Oracle 19c 数据库上对我有用。(我从来没有在 php 上工作过,只是在这里和那里用谷歌搜索)

    $sql = "SELECT ename FROM emp WHERE hiredate > TO_DATE(:hdate,'YYYY-MM-DD')";
    $stid = oci_parse($conn, $sql);
    $hdate = "1980-01-01";
     oci_bind_by_name($stid,':hdate', $hdate);
   // oci_bind_by_name($stid,":hdate", $hdate);  //this line also works i.e double quotes

编辑:- IN 子句也适用于我。这是我了解到的,您不能在 OCI_BIND 中传递文字值,即首先将文字分配给变量

$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);

检查这些链接 1 链接 2 以获取适用于 Oracle 数据库的示例


推荐阅读