integer ocinewcursor(integer link)
Функция ocinewcursor предназначена для создания курсора. Возвращаемый идентификатор курсора аналогичен идентификатору оператора. Для освобождения памяти, занятой курсором, используется функция ocifreecursor. Как видно в листинге 17.40, курсор можно использовать для получения данных, возвращаемых хранимой процедурой. В листинге 17.39 показан пакет, используемый в листинге 17.40.
Для того чтобы использовать курсор, его необходимо сначала создать с помощью функции ocinewcursor. Проанализируйте запрос, содержащий маркеры, и присоедините маркер к курсору. Выполните оператор, а затем курсор. Теперь можно производить операцию чтения из курсора совсем так же, как из выполненного оператора.

| Листинг 17.39. Пакет Oracle со ссылочными курсорами_
CREATE OR REPLACE PACKAGE emp_data AS
TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE; PROCEDURE open_emp_cv (
emp_number IN emp.empno%TYPE, emp_cv IN OUT EmpCurTyp); 
END emp_data;
CREATE OR REPLACE PACKAGE BODY emp_data AS
PROCEDURE open_emp_cv (
emp_number IN emp.empno%TYPE, emp_cv IN OUT EmpCurTyp) IS
BEGIN
OPEN emp_cv FOR SELECT * FROM emp
WHERE empno = emp_number; END open_emp_cv; END emp_data;

Листинг 17.40. Функция ocinewcursor

<?php
// открыть соединение
$Connection = ocilogon("scott", "tiger"); // создать курсор
$Cursor = ocinewcursor($Connection);
//создать оператор, который вызывает хранимую процедуру $Query = "BEGIN emp_data.open_emp_cv(79 02, :myrow); END;"; $Statement = ociparse($Connection, $Query); // присоедините маркер к курсору
ocibindbyname($Statement, ":myrow", $Cursor, -1, OCI_B_CURSOR);
// выполнить оператор
ociexecute($Statement);
// выполнить курсор
ociexecute($Cursor);
//получить строку из курсора
while(ocifetchinto($Cursor, $Column,
OCI_NUM | OCI_RETURN_NULLS))
{
print(implode(',', $Column) . "<br>n");
}
//освободить память для оператора
ocifreestatement($Statement);
// освободить строку
ocifreecursor($Cursor);
// закрыть соединение
ocilogoff($Connection);
?>

string ocinewdescriptor(resource connection, integer type)
Функция ocinewdescriptor выделяет память под дескрипторы и локаторы LOB. По умолчанию аргумент type задает файл, но можно задать значение OCI_D_FILE, OCI_D_LOB или OCI_D_ROWID. Пример применения этой функции см. в описании функции ocibindbyname.
integer ocinlogon(string user, string password, string sid)
Функция ocinlogon устанавливает уникальное подключение к базе данных Oracle. Идентификатор, который она возвращает, используется при создании операторов, курсоров и дескрипторов. Необходимо задавать аргументы user и password. Необязательный аргумент sid задает сервер; в том случае, если он отсутствует, используется переменная среды ORACLE_SID. Сравните эту функцию с функциями ocilogon и ociplogon.
integer ocinumcols(resource statement)
Функция ocinumcols возвращает количество столбцов в операторе.
integer ociparse(resource connection, string query)
Функция ociparse делает из запроса оператор. Для нее требуется действующий идентификатор соединения.
integer ociplogon(string user, string password, string sid)
Функция ociplogon создает устойчивое соединение с базой данных Oracle. Эти соединения существуют так же долго, как и процесс на сервере. При запросе устойчивого соединения можно получить соединение, которое уже существует, избегая тем самым перегрузки, вызванной созданием нового соединения. Идентификатор, который возвращает эта функция, используется при создании операторов, курсоров и дескрипторов. Аргументы user и password обязательны. Необязательный аргумент sid задает сервер; в том случае, если он отсутствует, используется переменная среды ORACLE_SID. Сравните эту функцию с функциями ocilogon и ocinlogon.
string ociresult(resource statement, value column)
Функция ociresult предназначена для получения имен столбцов текущей строки. Столбец может обозначаться номером или именем. Столбцы пронумерованы с единицы. Результаты возвращаются в виде строк за исключением случаев LOB, ROWID и FILE. Пример использования этой функции см. в описании функции ocifetch.