Читайте также:
|
|
Параметризованные курсоры
Явные курсоры могут использовать параметры:
CURSOR workload_c (Cempid employees.empid%TYPE,Cprojid projects.projid%TYPE,Cwork_date DATE) ISSELECT *FROM workloadWHEREempid = Cempid ANDprojid = Cprojid ANDwork_date = Cwork_date; Это хорошая практика всегда использовать параметры, основанные на типах данных таблицы, с которой предполагается их использовать.Имя параметра должно отличаться от имени столбца в локальном курсоре; в противном случае, будет возвращена каждая строка! (x = x всегда TRUE). Будьте последовательны при выборе имен параметров; например, "всегда использовать символ С после имени столбца" это правило может использовать, как стандарт при работе с явными курсорами.
Имя параметра является просто “заполнителем” для переменной, которую Вы поставляете. Область - строго локальная в теле курсора.
OPEN workload_c (v_empid, v_projid, SYSDATE);Поскольку курсоры являются объектами только для чтения, Вам не нужно определять поток для параметров. Поток - всегда в (IN).
4.Курсорные циклы. В чём их преимущество. Особенность использования переменной курсорного цикла.
Курсорные циклы FOR
Курсорный цикл FOR - итеративная конструкция, которая позволяет использовать OPEN, FETCH, CLOSE курсор в пределах цикла. Он позволяет выполнять операции над каждой строкой, выбранной в цикле. Обычно он используется, когда Вы собираетесь обрабатывать каждую строку, которую он возвращает. Если Вам нужно прервать цикл преждевременно, используйте явные курсоры (с их большим управлением).
DECLARECURSOR addresses_c ISSELECT * FROM addressesWHERE state = 'PA';BEGINFOR rec IN addresses_c LOOPDBMS_OUTPUT.put_line('ROWCOUNT=' ||TO_CHAR(addresses_c%ROWCOUNT, '000'));END LOOP;END;Вывод из курсора rec может использоваться только в цикле. Вы не можете использовать запись (record) за пределами цикла, поскольку она не существует за пределами области цикла. Если Вам нужно видеть значение переменной типа record за пределами цикла, назначьте ему некоторую переменную, определенную за пределами цикла. Record переменная неявно объявлена с теми же типами полей, что и строки курсора, и может быть названа, как угодно.
Ни один из атрибутов курсора, кроме ISOPEN, недоступен за пределами цикла, поскольку курсор не открыт. Если Вы пытаетесь вызвать FOUND, NOTFOUND и ROWCOUNT за пределами курсора для (FOR) цикла, то получите ошибку: ORA-01001: invalid cursor.
Подобно явным курсорам, курсор, использованный на курсоре для (FOR) цикла, может также использовать параметры.
Самый простейший вид курсора для (FOR) цикла представляет собой запрос, вставленный в описание цикла:
FOR x IN (SELECT * FROM addresses) LOOPcnt:= cnt + 1; -- сделаем здесь что-нибудь полезное -- (do something useful here) END LOOP;5.Типы данных PL/SQL: скалярные, составные, ссылочные.
Дата добавления: 2015-04-22; просмотров: 13 | Поможем написать вашу работу | Нарушение авторских прав |