Вызов функции / процедуры, представленной внутри пакета Oracle из PHP
Здравствуйте, я работаю с 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
Я неправильно передаю запрос? Или я неправильно связываю параметры?
:РЕДАКТИРОВАТЬ
Здравствуйте, теперь я получил данные, поступающие в 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 ответа
Я больше не использую PDO, я буду использовать драйверы OCI. Спасибо за всю помощь.
Функция принимает один или два параметра? В SQL*Plus вы передаете два параметра. В PHP вы передаете только один. Если функция требует двух параметров и нет перегруженного метода, который принимает только один параметр, вы получите эту ошибку.
Вот ссылка на ответ на аналогичный вопрос [ССЫЛКА]: /questions/42177976/kak-poluchit-neskolko-strok-iz-hranimoj-funktsii-s-orakulom/55321146#55321146
или лучше
//Your connection details
$conn = oci_connect($username, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))' );
/* Your query string; you can use oci_bind_by_name to bind parameters or just pass the variable in it*/
$query = "begin :cur := functionName('".$param1."','".$param2."','".$param3."'); end;";
$stid = oci_parse($conn, $query);
$OUTPUT_CUR = oci_new_cursor($conn);
oci_bind_by_name($stid, ':cur', $OUTPUT_CUR, -1, OCI_B_CURSOR);
oci_execute($stid);
oci_execute($OUTPUT_CUR);
oci_fetch_all($OUTPUT_CUR, $res);
// To get your result
var_dump($res);