Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.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/OCI中发生的Oracle错误_Php_Sql_Oracle_Oracle Call Interface - Fatal编程技术网

调试仅在PHP/OCI中发生的Oracle错误

调试仅在PHP/OCI中发生的Oracle错误,php,sql,oracle,oracle-call-interface,Php,Sql,Oracle,Oracle Call Interface,我有一个查询,用于计算小时总数,并根据为Oracle数据库编写的小时数的组成分配一个值 查询在Navicat和Toad中运行良好,但在使用OCI/PHP运行查询时,我遇到以下错误: ORA-00972:标识符太长 我理解消息的含义,但我的标识符都不超过30个字符。在这种情况下,我给表名添加了别名,这没有什么区别 我的代码如下: $query ="SELECT SUM( ROUND((A.SCHED_DATE_TO - A.SCHED_DATE_FROM)* 24, 1 )), SUM

我有一个查询,用于计算小时总数,并根据为Oracle数据库编写的小时数的组成分配一个值

查询在Navicat和Toad中运行良好,但在使用OCI/PHP运行查询时,我遇到以下错误:

ORA-00972:标识符太长

我理解消息的含义,但我的标识符都不超过30个字符。在这种情况下,我给表名添加了别名,这没有什么区别

我的代码如下:

$query ="SELECT
   SUM( ROUND((A.SCHED_DATE_TO - A.SCHED_DATE_FROM)* 24, 1 )),
   SUM( CASE WHEN A.ACTION_TYPE_CODE = 'INSV' THEN ROUND((A.SCHED_DATE_TO-A.SCHED_DATE_FROM)* 24, 1)*30 ELSE 42.50 END)
FROM
   WAREHOUSE.DM_DIM_ACTION \"A\",
   WAREHOUSE.DM_FCT_ACTION \"C\", 
   WAREHOUSE.DM_DIM_TECHNICIAN \"B\"
WHERE
   A.SHUB_ID = C.SHUB_ID
   AND C.FK_TECHNICIAN_WID = B.ROW_WID
   AND A.SITE_VISIT_YN = 'Y'
   AND A.ACTION_TYPE_CODE IN('INSV', 'SURV')
   AND A.STATUS_CODE IN('FDSP', 'DISP', 'ASSN')
   AND A.ASSIGNED_CONTRACTOR_CODE = 'NOCO'
   AND TRUNC( A.SCHED_DATE_FROM )= '20-Sep-11'
   AND B.CELL = 'C04'";

   $stid = oci_parse($conn, $sql); if (!$stid) { echo oci_error($conn); $e = oci_error($conn); print htmlentities($e['message']); }
   $r = oci_execute($stid, OCI_DEFAULT); if (!$r) { $e = oci_error($stid); echo htmlentities($e['message']); }
   $planned = oci_fetch_array($stid, OCI_RETURN_NULLS);
我做错了什么?有没有什么方法/工具可以用来进一步诊断类似问题

编辑: 根据评论,我尝试删除较大的字段并简化查询以缩小问题范围。下面的查询也提供了相同的错误,删除了最大的字段名

SELECT
   SUM( ROUND((A.SCHED_DATE_TO - A.SCHED_DATE_FROM)* 24, 1 )),
   SUM( CASE WHEN A.ACTION_TYPE_CODE = 'INSV' THEN ROUND((A.SCHED_DATE_TO-A.SCHED_DATE_FROM)* 24, 1)*30 ELSE 42.50 END)
FROM
   WAREHOUSE.DM_DIM_ACTION "A"
WHERE
   AND A.SITE_VISIT_YN = 'Y'
   AND TRUNC( A.SCHED_DATE_FROM )= '20-Sep-11'

问题不是SQL格式,而是我将错误的查询字符串传递给了OCI_parse函数

如果研究问题中的代码,您会注意到我试图传递$sql,而不是我刚才定义的$query变量


对于多个查询,您再小心也不为过

A.指定的承包商代码不超过30个字符,但WAREHOUSE.DM\u DIM\u ACTION.ASSIGNED\u CONTRACTOR\u代码为。我没有说这是原因,但我想到了这一点。是的,我从中了解到了——不幸的是,我的知识有点粗略,我假设通过给WAREHOUSE.DM_DIM_动作和别名,我可以绕过这一点。为什么这个带别名或不带别名的查询在Toad/Navicat中仍然有效?它们有什么不同?我不能具体告诉你,因为我不知道。也许PHP中的OCI库正在对其进行预解析?我只想用一个简单得多的查询快速测试它是否真的触发了PHP的限制。可能会很快透露一些导致错误的细节。谢谢hakre,对不起,我是在夸夸其谈,而不是直接问其他软件的问题。使用较小的查询,我假设问题出在我的派生字段上。我一直是个白痴,将不正确的$sql变量传递给解析器,而不是实际的查询变量$query.: