Вызов функции/процедуры, присутствующей в пакете 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, но он все равно выдает мне ошибку.
2 answers
Принимает ли функция один или два параметра? В SQL*Plus вы передаете два параметра. В PHP вы передаете только один. Если для функции требуется два параметра и нет перегруженного метода, который принимает только один параметр, вы получите эту ошибку.
Я больше не использую PDO, я бы использовал драйверы OCI. Спасибо вам за всю помощь.