Вызов функции / процедуры, представленной внутри пакета Oracle из PHP - PullRequest
4 голосов
/ 19 января 2011

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

   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

Я передаю запрос вНеправильный путь?Или я неправильно связываю параметры?

: EDIT

Здравствуйте. Теперь я получил данные, передаваемые в 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 ]

1 голос
/ 24 января 2011

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

1 голос
/ 19 января 2011

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

...