Возвращение таблицы через OCI8 из хранимой процедуры Oracle - PullRequest
0 голосов
/ 22 ноября 2011

Я подключаюсь к Oracle через OCI8.

У меня есть хранимая процедура:

  PROCEDURE ocigetaccounts(accounts OUT SYS_REFCURSOR)
  IS BEGIN
  OPEN accounts FOR
        SELECT * FROM tbaccounts;
  END ocigetaccounts;

И я пытаюсь вернуть его в PHP, используя OCI:

$sqlString = 'BEGIN accounts.ocigetaccounts(:accounts); END;';
oci_bind_by_name($statement, ':accounts', $result, -1);
    echo $result;

(Остальная часть требуемого OCI на стороне php на месте.)

Я получаю ошибку:

Предупреждение: oci_execute (): ORA-06550: строка 1, столбец 7: PLS-00306: неверный номер или типы аргументов при вызове 'OCIGETACCOUNTS'

Как получить $ result для контейнера ресурса таблицы

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Насколько я могу судить, $result будет содержать ресурс, который вы ищете. Вы получаете ошибку, потому что курсор не определен как курсор типа. Вы должны явно определить $result как курсор

$result = oci_new_cursor( $dbci );

Если возвращается $result, он будет возвращен как ресурс, и вы должны обращаться с ним так же, как с любым другим возвращенным ресурсом.

Для вашего примера ($dbci является ресурсом соединения):

$sqlString = 'BEGIN accounts.ocigetaccounts(:accounts); END;';

$stmt = oci_parse ( $dbci, $sqlString );
//Declare cursor
$result = oci_new_cursor( $dbci );

//Bind cursor
oci_bind_by_name ( $stmt, ':accounts', $result, -1, OCI_B_CURSOR);

//Execute query
if (oci_execute ( $stmt )) {
    //Execute cursor
    oci_execute($result);  //Or you can return the cursor.
}

Так мы обрабатываем курсоры, возвращаемые из базы данных. Надеюсь, что это решит проблему

0 голосов
/ 23 ноября 2011

Есть проблемы с PHP и REFCURSORS.См. Эту превосходную статью в блоге для полного объяснения и обходного пути:

http://blogs.oracle.com/opal/entry/converting_ref_cursor_to_pipe

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...