Процедуры Oracle в php с PDO
У меня проблема с propel 1.6 и процедурой oracle. Я размещаю его под PDO, потому что я движу только для проксирования моего вызова PDO.
В основном процедура получения имени пользователя и пароля, проверяет, что есть ОК и верните пользователя. По этой причине он возвращает тип.cursorType.
Sql начинается так.
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'
Что я делаю не так?
Заранее благодарю.
P. S: Я задаю этот вопрос на форуме Propel, и они направляют меня на поиск решения PDO.
2 ответа:
Я подозреваю, что проблема заключается в первом параметре. Вы говорите PDO, что это строка (
К несчастью, драйвер Oracle для PDO является экспериментальным и (IMHO) в основном заброшенным.PDO::PARAM_STR
), но на самом деле этоtypes.cursorType
. Есть комментарий пользователя в руководстве PHP, который предполагает, что ref-курсоры не поддерживаются.
Проверяет, что все в порядке, и возвращает пользователя
Нет - согласно прототипу он возвращает курсор. курсоры не имеют никакого значения вне PL/SQL . Если вы измените тип на sys_refcursor и явно инициализируете $result_arr как массив, я ожидаю, что у него будет больше шансов работать.
Хотя, глядя на ответ Альваро и отсутствие нескалярного типа парамера, я думаю, что это не так.