从PHP调用Oracle包中的函数/过程

从PHP调用Oracle包中的函数/过程,php,oracle,pdo,ora-00932,Php,Oracle,Pdo,Ora 00932,我正在使用PHP-PDO和Oracle 11g。我正在使用Oracle软件包,它有许多函数和存储过程。现在,当我从sql*plus或sql developer IDE调用其中一个函数时,我运行这个命令来获得结果集 select package_name.function_name(param1,param2) from dual 它工作正常并返回我的结果集。现在,当我做同样的事情时,我会从PDO异常处理中得到错误。PHP端带有的代码如下所示 $stmt = "select package

我正在使用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
我是否以错误的方式传递了查询?还是我以错误的方式绑定了参数

更新 现在,我已经将数据传送到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

我正在确保所有类型都是正确的,但我仍然返回相同的错误。我甚至删除了空值并传入了一个字符串,并将pdo类型更改为pdo::PARAM_STR,但它仍然给出了错误信息。

函数接受一个或两个参数吗?在SQL*Plus中,您要传递两个参数。在PHP中,只传递一个。如果函数需要两个参数,并且没有只接受一个参数的重载方法,则会出现此错误。

我不再使用PDO,而是使用OCI驱动程序。感谢您的帮助。

这里有一个链接,指向类似问题的答案[link]:

或者最好


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



我试图通过另一个参数传递null。我只传递一个参数的值。我该如何处理这个问题?@macha-那么,在为第二个参数传递NULL值时,您得到的是完全相同的错误?不,我实际上找到了绑定NULL值的方法,现在我得到了一个不同的错误。@macha-好的。你有没有用新的错误更新你的帖子?那里的错误似乎与您只传入一个参数时遇到的错误相同。Justin,我刚刚更新了帖子,您能看一下吗?我已经查询了架构中的其他表,它们返回了一个结果集,因此凭据在包中起作用。函数?@macha-是的。在packageJustin中发布函数的规范我刚刚粘贴了被调用的函数。@macha-OK。您发布的函数似乎需要4个参数,而不是2个。另外,您是否可以发布MY表的定义(或者至少发布四个
%类型的
声明的解析结果)?