Динамічний SQL в ORACLE (частина 4 - Фішки, секрети та типові помилки)

У цьому розділі показано, як використовувати динамічний SQL і уникнути деяких поширених помилок. Підвищення продуктивності

У наведеному нижче прикладі Oracle відкриває різні курсори для кожного окремого значення emp_id . Це може призвести до конфлікту ресурсів та різкої втрати продуктивності.

Щоб уникнути цієї помилки, можна використовувати пов'язані змінні, як показано нижче. Це дозволяє повторно використовувати Oracle той самий курсор для різних значень emp_id .

Робота над довільними об'єктами схеми

Припустимо, вам потрібна процедура, яка приймає ім'я таблиці бази даних, а потім видаляє цю таблицю зі схеми. Використовуючи динамічний SQL, ви можете написати таку процедуру:

Проте під час виконання цієї процедури виникає помилка неприпустимого імені таблиці. Це тому, що ви не можете використовувати прив'язку аргументів для передачі імен об'єктів схеми динамічного оператора SQL.

Натомість, необхідно зробити параметри в динамічному SQL, а потім задати імена об'єктів схеми цим параметрам. В останньому прикладі, ви повинні змінити EXECUTE IMMEDIATE . Ви задаєте параметр table_name у динамічному рядку, таким чином:

Тепер можна передати ім'я будь-якої таблиці бази даних в динамічний оператор.

Використання Атрибутів курсорів Кожен явний курсор має чотири атрибути: %FOUND , %ISOPEN , %NOTFOUND та %ROWCOUNT . Вони повертають корисну інформацію про виконання статичних і динамічних SQL команд. Для обробки SQL виразів маніпуляції даними, Oracle відкриває неявний курсор з ім'ям SQL. Його атрибути - інформація про останні виконані INSERT, UPDATE, DELETE або SELECT. Наприклад, у наступній функції %ROWCOUNT повертаєкількість віддалених рядків із таблиці бази даних:

Тип Null Припустимо, що потрібно передати NULL в динамічний оператор SQL. Наприклад, ви могли б написати наступний

Однак, ця команда викликає помилку, оскільки використання NULL не допускається в USING таким чином. Щоб обійти це обмеження, просто замініть ключове слово NULL на неініціалізовану змінну:

Виконання віддалених операцій через DB LINK Як показує наступний приклад, PL/SQL підпрограма може виконувати динамічний SQL, який працює з об'єктами на віддаленій базі даних:

Також виклики віддалених процедур (RPC) можуть містити динамічні оператори SQL. Наприклад, припустимо, що наступна функція, яка повертає кількість рядків у таблиці, знаходяться в базі даних Чикаго:

Код, який можна викликати функцію віддалено:

Як уникнути deadlock

У деяких ситуаціях виконання SQL ми створюємо deadlock. Наприклад, наведена нижче процедура викликає deadlock через те, що намагається видалити сама себе.

Щоб уникнути таких ситуацій, ніколи не намагайтеся зробитиALTERабоDROPпідпрограми або пакета в той час. як досі використовуєте його.

Перший приклад не є специфічним для динамічного SQL, а відноситься до використання пов'язаних змінних. І вже зовсім некоректне обґрунтування: різні курсори відкриватимуться і при використанні пов'язаних змінних.

не згоден. перевірте свої дані , відкривається 1 курсор не згоден приклад демонструє як некоректно використовувати динамічний SQL таке в коді зустрічається досить часто