Процедуры Oracle в php с PDO

У меня проблема с двигателем 1.6 и процедурой оракула. Я отправляю его под PDO, потому что я Propel только для проксирования моего вызова PDO.

В основном процедура получает имя пользователя и пароль, проверяет, что все в порядке и возвращает пользователя. По этой причине он возвращает type.cursorType.

Это так.

CREATE OR REPLACE PROCEDURE "SP_LOGIN" (R_CURSOR OUT types.cursorType, UserId IN VARCHAR2, Password IN VARCHAR2) 

мой php-код:

 $con = Propel::getConnection(); $sql = 'BEGIN SP_LOGIN(:CURSOR, :0, :1); END;'; $stmt = $con->prepare($sql); $result_arr; $stmt->bindParam(":CURSOR", $result_arr, PDO::PARAM_STR || PDO::PARAM_INPUT_OUTPUT); $stmt->bindParam(":0", $username, PDO::PARAM_STR); $stmt->bindParam(":1", $password, PDO::PARAM_STR); $stmt->execute(); $result_arr = $stmt->fetchAll(); 

Теперь, когда выбрано исключение типа: {PDOException} SQLSTATE [HY000]: Общая ошибка: 6550 OCIStmtExecute: ORA-06550: línea 1, columna 7: PLS-00306: числа или типы плохих аргументов, вызывающие «SP_LOGIN»

Что я делаю неправильно?

Заранее спасибо.

PS: Я задаю этот вопрос на форуме Propel, и они направляют меня на поиск решения PDO.

Я подозреваю, что проблема – это первый параметр. Вы PDO::PARAM_STR PDO, что это строка ( PDO::PARAM_STR ), но на самом деле это types.cursorType . В руководстве по PHP есть комментарий пользователя, который говорит о том, что курсоры ref не поддерживаются.

К несчастью, драйвер Oracle для PDO является экспериментальным и (IMHO) в основном заброшен.

проверяет, что все в порядке и возвращает пользователя

Нет – в соответствии с прототипом он возвращает курсор. Курсоры не имеют значения вне PL / SQL . Если вы измените тип на sys_refcursor и явно инициализируете $ result_arr как массив, я ожидаю, что у него будет больше шансов на работу.

Хотя, глядя на ответ Альваро и отсутствие нескалярного параметра, я думаю, что это не так.