您好我正在使用PHP-PDO和Oracle 11g。我正在使用具有许多功能和存储过程的Oracle包。现在,当我调用sql * plus或sql developer IDE中的一个函数时,我运行此命令来获取结果集。
select package_name.function_name(param1,param2) from dual
它工作正常并返回我的结果集。现在,当我这样做时,我从PDO异常处理中得到错误。 PHP端的代码如下所示,
$stmt = "select package_name.function_name (?,?) from dual";
$res = $this->ConnOBJ->prepare($stmt);
$param1 = '1';
$param2 = null;
$result->bindParam(1,$param1);
$result->bindParam(2,$param2);
$result->execute();
我收到一个异常,它被记录到我的日志文件中。
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 904 OCIStmtExecute: ORA-00904: "PACKAGE_NAME"."FUNCTION_NAME"": invalid identifier (/var/www/php-5.3.3/ext/pdo_oci/oci_statement.c:146)' in /opt/web/dir/ora_class.php:209 Stack trace: #0 /opt/web/dir/ora_class.php(209): PDOStatement->execute() #1 /opt/web/dir/ora_class.php(298): dbPDO->execPackage() #2 {main} thrown in /opt/web/dir/ora_class.php on line 209
我是否以错误的方式传递查询?或者我是以错误的方式绑定参数?
:EDIT
您好我现在已经将数据传递给Oracle,并且已经找到了如何传递空值。我的代码现在是
$stmt = "select package_name.function_name(?,?) from dual";
$res = $this->ConnOBJ->prepare($stmt);
$param1 = 1;
$param2 = null;
$res->bindParam(1,$param1,PDO::PARAM_INT);
$res->bindParam(2,$param2,PDO::PARAM_NULL);
$res->execute();
var_dump($res->fetchAll());
现在,当我传递数据时,我收回了错误
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 932 OCIStmtFetch: ORA-00932: inconsistent datatypes: expected CHAR got DTYCWD (/var/www/php-5.3.3/ext/pdo_oci/oci_statement.c:467)' in /opt/web/dir/ora_class.php:216 Stack trace: #0 /opt/web/dir/ora_class.php(216): PDOStatement->fetchAll() #1 /opt/web/dir/ora_class.php(305): dbPDO->execPackage() #2 {main} thrown in /opt/web/dir/ora_class.php on line 216
我确保所有类型都是正确的,但我仍然会收到同样的错误。我甚至删除了null值并传入了一个字符串,并将pdo类型更改为PDO :: PARAM_STR,但它仍然给我错误。
答案 0 :(得分:1)
该功能是一个还是两个参数?在SQL * Plus中,您传递了两个参数。在PHP中,你只传递一个。如果函数需要两个参数,并且没有只有一个参数的重载方法,则会出现此错误。
答案 1 :(得分:1)
我不再使用PDO了,我会使用OCI驱动程序。谢谢你的帮助。
答案 2 :(得分:0)
此处是指向类似问题[LINK]的答案的链接:https://stackoverflow.com/a/57558306/7897970
或最佳
//Your connection details
$conn = oci_connect($username, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))' );
/* Your query string; you can use oci_bind_by_name to bind parameters or just pass the variable in it*/
$query = "begin :cur := functionName('".$param1."','".$param2."','".$param3."'); end;";
$stid = oci_parse($conn, $query);
$OUTPUT_CUR = oci_new_cursor($conn);
oci_bind_by_name($stid, ':cur', $OUTPUT_CUR, -1, OCI_B_CURSOR);
oci_execute($stid);
oci_execute($OUTPUT_CUR);
oci_fetch_all($OUTPUT_CUR, $res);
// To get your result
var_dump($res);