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

您好我正在使用
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

我确保所有类型都是正确的,但我仍然得到同样的错误.我甚至删除了null值并传入了一个字符串,并将pdo类型更改为PDO :: PARAM_STR,但它仍然给我错误.

最佳答案 该函数是一个还是两个参数?在SQL * Plus中,您传递了两个参数.在PHP中,你只传递一个.如果函数需要两个参数,并且没有只有一个参数的重载方法,则会出现此错误.

点赞