|
Программирование >> Sql: полное руководство
клиент/сервер, роль динамического SQL стала более важной Пользователи персональных компьютеров все чаще работают с базами данных в таких приложениях, как электронные таблицы, текстовые процессоры и графические редакторы, а клиентские программы доступа к данным - это одна из наиболее быстро растущих областей баз данных. Во всех этих приложениях необходим динамический SQL Важность динамического SQL еще больще возросла с появлением в последние годы трехуровневых Internet-архитектур, в которых управляющее ПО расположено на одной системе (прикладной, или промежуточный, уровень), а СУБД - на другой (информационный, или серверный, уровень). В больщинстве таких систем программная логика довольно непостоянна, динамична по своей природе Она должна адаптироваться к меняющимся условиям бизнеса, к появлению новых деловьк правил Регулярно изменяющаяся профаммная среда плохо сочетается со статическим SQL, в котором между программой и содержимым базы данных существует жесткая связь. Как следствие, в трехуровневых архитектурах применяются вызовы функций различных профаммных интерфейсов SQL (описываются в следующей главе), связывающих программы промежуточного уровня с базами данных серверного уровня. В этих интерфейсах явно заимствуются многие концепции из динамического SQL; в частности, имеются функциональные аналоги инструкций prepare, execute и execute immediate. Поэтому важно четко понимать принципы работы динамического SQL, чтобы представлять, что происходит за кулисами профаммных интерфейсов SQL Динамическое выполнение инструкций (инструкция EXECUTE IMMEDIATE) Наиболее простой формой динамического SQL является инсфукция execute immediate, синтаксическая диафамма которой изображена на рис. 18.2. Эта инструкция передает в СУБД динамически сформированную сфоку инсфукции SQL и дает команду выполнить ее немедленно. Схема применения инструкции execute immediate выглядит так; L В одной из своих областей данных (обычно называемой буфером) профамма формирует инструкцию SQL в виде текстовой сфоки. Ею может быть практически любая инсфукция SQL, не извлекающая данные 2. Программа передает сформированную инсфукцию SQL в СУБД с помощью инструкции execute immediate. 3. СУБД выполняет инсфукцию и присваивает код завершения переменным sql-code/sqlstate ТОЧНО так Же, квк при Встраивании инструкции в профамму с помощью статического SQL. ЕХЕСит immediate базовая пврвменная- Рис 18.2 Синтаксическая диаграмма инструкции EXECUTE IMMEDIATE На рис. 18.3 изображена простая профамма на языке С, осуществляющая эти действия. Профамма запрашивает у пользователя имя таблицы и условие отбора, а Затем на основе полученных ответов формирует текст инсфукции delete. Для ,ыполиения этой инструкции в программе применяется инструкция execute imme-)iate. Использовать статическую встроенную инструкцию delete нельзя, т.к. ни 1МЯ таблицы, ни условие отбора не известны до тех пор, пока пользователь не введет !х во время выполнения профаммы. mam О ( /* Данная программа удаляет строки из указанной пользователем таблицы в соо1?ветствии с заданным условием exec sql include sqlca; exec sql begin declare section; char stmtbuf[3011; /* текст инструкции SQL */ exec sql end declare section; char tblname[101]; /* имя таблицы, введенное пользователем */ char search cond[101J; /* условие отбора, введенное пользователем */ /* Начать формирование инструкции DELETE в переменной stmtbuf */ stropy(stntbuf, delete from ); /* Запросить у пользователя имя таблицы и добавить его в инструкцию */ printf( Введите имя таблицы: ); gets(tblname); strcat(stmtbuf, tblname); /* Запросить у пользователя условие отбора и добавить его в инструкцию */ printf( Введите условие отбора: ); gets(search cond); if (strlen (search cond) > 0) { strcat(stmtbuf, where ); strcat (stmtbuf, search cond); /* Выполнить инструкцию * exec sql execute imiediate : stmtbuf; if (sqlca.sqlcode < 0) prmtf ( Ошибка SQL: %ld\n , sqlca. sqlcode) ; else printf( Удаление из таблицы %s прошло успешно.\n , tblname); exit (0), Рис 18.3 Применениэ инструщии EXECUTE IMSEDIATE Если запустить профамму, текст которой приведен на рис. 18.3, и ввести следующую информацию; Введите имя таблицы; staff Введите условие отбора: quota < 20000 Удаление из таблицы staff прошло успешно. то профамма передаст в СУБД такую сфоку инсфукции: delete from staff where quota < 20000 Если же ввести следующую информацию: Введите имя таблицы: orders Введите условие отбора: cust = 2105 Удаление из таблицы orders прошло успешно. то программа передаст такую строку: delete from orders where cust = 2105 Таким образом, инструкция execute immediate предоставляет профамме боль-щую гибкость в выборе вида инсфукции delete. В инсфукции execute immediate применяется только одна базовая переменная, содержащая всю сфоку инсфукции SQL. Сама сфока инсфукции не может содержать ссылки на базовые переменные, но в этом и нет необходимости. Вместо того чтобы использовать статическую инсфукцию SQL с базовой переменной, наподобие следующей; exec sql delete from orders where cust = :cust num; профамма с динамическим SQL получает тот же результат, формируя в буфере, а затем выполняя целую инструкцию: sprintf(buffer, delete from orders where cust = %d , cust num) exec sql execute immediate :buffer; Инсфукция execute immediate представляет собой самую простую форму динамического SQL, но в то же время является очень гибкой. С ее помощью можно динамически выполнять больщинство инсфукций DML, включая инсфукции insert, delete, update, commit и rollback. Используя инсфукцию execute immediate, можно также динамически выполнять большинство инсфукций DDL, в том числе create, drop, grant и revoke. Однако у инструкции execute immediate есть один существенный недостаток. С ее помощью нельзя динамически выполнить инсфукцию select, так как в инсфукции execute immediate отсутствует мехвнизм обработки результатов запроса. Точно так же, как в статическом SQL для запросов на выборку фебуются наборы записей и специальные инсфукции (declare cursor, open, fetch и close), в динамическом SQL для выполнения динамических запросов на выборку тоже используются наборы записей и несколько специальных инсфукций. Ниже в настоящей главе рассматриваются средства динамического SQL, обеспечивающие реализацию динамических запросов на выборку. fljHOMMHecKoe выполнение в два этапа Инструкция execute immediate обеспечивает одноэтапное вьшолнение динамической инсфукции. Как уже говорилось, для выполнения динамической инсфук-Ции СУБД проходит через все пять этапов процесса, изображенного на рис. 18. L Если в профамме содержится много динамических инсфукций, то машинное время, зафачиваемое на осуществление такого процесса, может быть значительным; и если
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |