php执行oracle程序包,从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中,你只传递一个.如果函数需要两个参数,并且没有只有一个参数的重载方法,则会出现此错误.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值