Ефективне програмування на PL
Written on 26 Грудня 2008 . Posted in Oracle
ЗМІСТ
Взаємозамінність динамічного курсору та REF-курсора
Ви знаєте, яким корисним може бути Native Dynamic Cursor, особливо коли до виклику не знаєш точно, що буде запитуватися. Динамічний PL/SQL також можна використовувати через DBMS_SQL. Обидва методи мають переваги. Але що буде, якщо ви почали розробляти програму, де використовується спочатку один метод, а потім необхідно переключитися на інший?
У Oracle Database 11 g цей процес надзвичайно простий. Пакет DBMS_SQL, що підтримується, має нову функцію, TO_REFCURSOR, яка конвертує динамічний курсор DBMS_SQL в ref-курсор. Ось приклад такої конвертації:
Припустимо, потрібно написати загальну процедуру, яка не знає списку стовпців у select-вираженні під час компіляції. Це той випадок, коли природний dynamic SQL стає необхідним. Можна описати йому ref-курсор. Тепер, щоб стало цікавіше, припустимо, що ви не знаєте всіх bind-змінних, для цього випадку найбільше підходить dbms_sql. Як виконати цю складну вимогу, написавши мінімум коду? Просто: почніть з dbms_sql для bind-змінних, а потім конвертуйте в ref-курсор.
Аналогічно, щоб конвертувати Native Dynamic SQL на REF-курсор, необхідно викликати іншу функцію, TO_CURSOR_NUMBER:
Ref-курсор, визначений у змінній c_ref_cur, має бути відкрито раніше цього виклику. Після цього виклику життя ref-курсора закінчено; маніпулювати можна лише dbms_sql-курсором.
Припустимо, ви знаєте bind-змінні під час компіляції, але знаєте списку select; ви можете почати з native dynamic sql, з ref-курсора, а потім замінити його на dbms_sql, щоб описатита витягти стовпці з курсору.
Висновок
Як бачите, Oracle Database 11 g містить кілька покращень, які допомагають писати код на PL/SQL більш ефективно.