Вызов функции/процедуры, присутствующей в пакете Oracle, из PHP


Здравствуйте, я работаю с PHP-PDO и Oracle 11g. Я работаю с пакетами Oracle, которые имеют множество функций и хранимых процедур. Теперь, когда я вызываю одну из функций из sql*plus или среды разработки sql, я запускаю эту команду, чтобы получить набор результатов.

   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, но он все равно выдает мне ошибку.

Author: macha, 2011-01-19

2 answers

Принимает ли функция один или два параметра? В SQL*Plus вы передаете два параметра. В PHP вы передаете только один. Если для функции требуется два параметра и нет перегруженного метода, который принимает только один параметр, вы получите эту ошибку.

 1
Author: Justin Cave, 2011-01-19 20:43:19

Я больше не использую PDO, я бы использовал драйверы OCI. Спасибо вам за всю помощь.

 1
Author: macha, 2011-01-24 14:36:17