Программирование >>  Oracle 

1 ... 261 262 263 [ 264 ] 265 266 267 ... 469


1204 Глава 16

рассмотрим последствия использования динамического или статического SQL;

разберемся, как использовать динамический SQL в программах с помощью средств стандартного пакета DBMS SQL;

изучим возможности встроенного (native) динамического SQL;

рассмотрим ряд проблем, с которыми можно столкнуться при использовании динамического SQL в приложениях, в частности нарушение цепочки зависимостей, уязвимость кода и трудности при его настройке.

Для выполнения всех примеров динамического SQL в этой главе необходим сервер Oracle 8.1.5 или более новых версий. Встроенный динамический SQL появился именно в этой версии и является одной из важнейших возможностей всех последующих версий. Для выполнения большинства примеров, в которых используются средства пакета DBMS SQL, достаточно сервера Oracle версии 7.1 или более новых версий (правда, функции, обрабатывающие массивы, появились в пакете DBMS SQL в версии 8.0).

Сравнение динамического и статического SQL

Использование динамического SQL - естественная возможность работать с базой данных через функциональный интерфейс, такой как ODBC, JDBC и OCI. Статический SQL обычно принято использовать в средах с предварительной компиляцией кода, таких как Pro*C, SQLJ и PL/SQL (я не оговорился: компилятор PL/SQL можно рассматривать как прекомпилятор). При работе через функциональный интерфейс поддерживается только динамический SQL. Программист создает запрос в виде строки, а затем эта строка анализируется, связываются входящие в нее переменные, запрос выполняется, при необходимости выбираются строки из результирующего множества через курсор и, наконец, соответствующий курсор закрывается. В среде статического SQL эти действия выполняются автоматически. Для сравнения создадим две выполняющие одинаковые действия PL/SQL-процедуры: одну с - использованием динамического SQL, а вторую - с использованием статического. Вот версия на основе динамического SQL:

scott@TKYTE816> create or replace procedure DynEmpProc(p job in varchar2)

2 as

3 type refcursor is ref cursor; 4

5 -- При использовании диначеского SQL необходимо

6 -- создать хост-переменные и выделить ресурсы.

7 l cursor refcursor;

8 l ename emp.ename%type;

9 begin

11 -- Начинаем с анализа запроса

12 open l cursor for

13 select ename

14 from emp

15 where job = :x USING in p job;



Динамический SQL 1205

17 loop

18 -- и явно ВЫБИРАЕМ данные через курсор.

19 fetch l cursor into l ename; 20

21 -- Необходимо самостоятельно обрабатывать ошибки

22 -- и делать выборку

23 exit when l cursor%notfound; 24

25 dbms output.put line(l ename);

26 end loop;

28 -- He забываем освободить ресурсы

29 close l cursor;

30 exception

31 when others then

32 -- а также перехватить и обработать все ошибки,

33 -- чтобы не допустить утечки ресурсов

34 -- при возникновении ошибок.

35 if (l cursor%isopen)

36 then

37 close l cursor;

38 end if; 3 9 RAISE;

40 end;

41 /

Procedure created.

А вот что мы имеем в случае статического SQL:

scott@TKrE816> create or replace procedure StaticEmpProc(p job in varchar2)

2 as

3 begin

4 for x in (select ename from emp where job = p job)

5 loop

6 dbms output.put line(x.ename);

7 end loop;

8 end;

Procedure created.

Эти две процедуры делают то же самое:

scott@TKYTE816> set serveroutput on size 1000000 scott@TKYTE816> exec DynEmpProc(CLERK)

SMITH ADAMS JAMES

MILLER

PL/SQL procedure successfully completed. scott@TKYTE816> exec StaticEmpProc(CLERK)



1206

Глава 16

SMITH ADAMS JAMBS MILLER

PL/SQL procedure successfully completed.

Понятно, однако, что версия с динамическим SQL требует от разработчика написания гораздо большего объема кода. По опыту знаю: статический SQL обеспечивает более высокую производительность труда программиста при написании кода (приложения разрабатываются быстрее), но динамический SQL обеспечивает большую гибкость при выполнении (программа в ходе работы может делать то, что не внесено в ее код явно). Кроме того, статический SQL (особенно в среде PL/SQL) будет выполняться намного эффективнее, чем динамический. Используя статический SQL, PL/SQL-машина при обработке одной строки интерпретируемого кода может сделать то, на что потребуется пять или шесть строк интерпретируемого кода с динамическим SQL. Поэтому я использую статический SQL где только возможно и применяю динамический, только если по-другому задачу решить нельзя. Оба они эффективны, ни один не имеет принципиальных преимуществ перед другим, и оба имеют свои специфические возможности и средства повышения производительности.

Когда использовать динамический SQL?

Многие задачи требуют использования динамического SQL в PL/SQL. Вот лишь некоторые из них.

Разработка обобщенных процедур, выполняющих стандартные действия вроде выгрузки данных в файлы. В главе 9 был представлен пример такой процедуры.

Разработка универсальных процедур загрузки данных в не известные заранее таблицы. Мы рассмотрим использование динамического SQL для загрузки данных в таблицу.

Динамический вызов других PL/SQL-процедур во время выполнения. Эта тема

затрагивается в главе 23. Здесь мы рассмотрим ее более детально.

Генерация условий (например, конструкции WHERE) в процессе работы на ос-

нове введенных пользователем данных. Это, пожалуй, основная причина использования динамического SQL большинством разработчиков. Я покажу в этой главе, как это надо (и как не надо!) делать.

Выполнение операторов ЯОД. Поскольку PL/SQL не разрешает включать статические операторы ЯОД в код приложения, остается использовать динамический SQL. Это позволит выполнять операторы, начинающиеся с ключевых слов CREATE, ALTER, GRANT, DROP и т.п.

Решаться перечисленные задачи будут с помощью двух средств языка PL/SQL. Сначала мы рассмотрим использование стандартного пакета DBMS SQL. Этот пакет существует уже достаточно давно, он появился в версии 7.1. Пакет обеспечивает процедурный метод выполнения динамического SQL, аналогичный использованию



1 ... 261 262 263 [ 264 ] 265 266 267 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика