php - 如果在 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。
非常感谢您。
解决方案
这在 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);
推荐阅读
- fonts - Ubuntu上的VSCode不读取已安装的字体
- sql - 主体 Oracle SQL 中未定义对象类型规范
- python - 将 userInput 分配给字典的更多 Pythonic 方式?
- r - 为管道中的多个操作枚举 R 中的变量时 DRY
- python - 如何更改 x 轴上的刻度?
- .htaccess - RewriteRule 错误地附加 index.php
- python - 如何将列表字符串转换为列表?
- excel - 在 Excel 中计算一组角度的均值和标准差
- r - 我们如何使用列名、缺失值的数量及其百分比来创建数据框
- python - 在 Python 中以前缀表示法递归创建给定字符串表达式的二叉树