Процедуры Oracle в php с PDO - PullRequest
3 голосов
/ 14 ноября 2011

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

В основном процедура получает имя пользователя и пароль, проверяет, что все в порядке, и возвращает пользователя.По этой причине он возвращает types.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ínea1, колонна 7: PLS-00306: числа или типы неверных аргументов, вызывающих 'SP_LOGIN'

Что я делаю не так?

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

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

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

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

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

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

3 голосов
/ 14 ноября 2011

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

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

...