|
Программирование >> Sql: полное руководство
update имя таблицы set - - имя столбца = выражение where current of имя набора записей Рис 17.31. Синтаксическая №<аграмма позиционной инсгрукции UPDATE mam () exe exe с sql include sqlca; с sql begin declare section; mt custnum; /* mt ordnum; /* char orddate[121; /* char ordmfr[4] ; /* char ordproduct[6] ; /* mt ordqty; /* float ordamount; /* exec sql end declare section; char inbuf[101]; /* символ идентификатор клиента, введенный пользователем .*/ полученный номер заказа */ полученная дата заказа */ полученный идентификатор производителя */ полученный идентификатор товара */ полученное количество */ полученная сумма заказа / введенный пользователем */ /* Объявить набор записей для запроса exec sql declare ordcurs cursor for select order num, ord date, mfr, product, qty, amount from orders where oust = cust num order by order num for update of qty, amount; /* Запросить у пользователя идентификатор клиента */ printf( Введите идентификатор клиента: ) ; scanf( %d , Scustnum); /* Обработка ошибок */ whenever sqlerror goto error; whenever not found goto done; /* Открыть набор записей exec sql open ordcurs; /* Просмотреть результаты запроса построчно */ for ( , ;) { /* Извлечь следующую строку результатов */ exec sql fetch ordcurs М- into :ordnum, :orddate, :ordmfr, :ordproduct :ordqty, :ordamount; /* Вывести данные */ printf( Номер заказа: %d\n , ordnum); prmtf( flaTa заказа: %s\n , orddate) ; printf( Производитель: %s\n , ordmfr); printf( Продукт: *s\n , ordproduct); printf( Количество: %d\n , ordqty); printf( Сумма заказа: %f\n , ordamount); Рис, 17.32. Применение позиционных инструкций DELETE и UPDATE /* Запросить у пользователя выполняемое действие */ printf( Укажите действие (Next/Delete/Update/eXit): ); gets (mbuf) ; switch (inbuf[0]) case N; / * Выв break; e N: /* Вывести следующий заказ */-(3) case D; /* Удалить текущий заказ */ .. exec sql delete from orders-(4) where current of ordcurs; break; case U: /* Обновить текущий заказ */ printf( Введите новое количество товара: ); scanf( %d , Sordqty); printf( Введите новую сумму: ); scanf( %f , lordamount) ; .. exec sql update orders-- (5j set qty = :ordqty, amount = :ordamount where current of ordcurs; break; case X : /* Прекратить обработку заказов -(6) goto done; done: exec sql close ordcurs; exec sql commit; exit(0); error: printf( Ошибка SQL: %ld\n , sqlca.sqlcode), exit(1); Рис 17.32. Применение позиционных инструкций DELETE и UPDATE 1- Программа запрашивает у пользователя идентификатор клиента, после чего выполняет запрос к таблице orders, чтобы отыскать все заказы, сделанные этим клиентом. 2. Программа извлекает одну строку результатов запроса, отображает на экране информацию о заказе и запрашивает дальнейшие инструкции. 3. Если пользователь вводит символ N , программа не модифицирует текущий заказ, а сразу переходит к следующему. 4. Если пользователь вводит символ D , программа удаляет текущий заказ с помощью позиционной инструкции delete. 5. Если пользователь вводит символ U , программа запрашивает у пользователя новое количество товара и сумму заказа, а затем обновляет соответствуюшие два столбца текущей записи с помощью позиционной инструкции update. 6. Если пользователь вводит символ X , программа прекращает вьшолнение запроса и заканчивает свою работу. Хотя пример, изображенный нарис. 17.32, является очень простым по сравнению с реальными приложениями, в нем отражена вся логика встроенных инструкций SQL необходимых для реализации программы, осуществляющей изменения в базе данных с помощью указателя набора записей. Для того чтобы позиционные инструкции delete и update можно было использовать совместно с указателями наборов записей, эти наборы записей, согласно стандарту SQL1, должны отвечать очень строгим требованиям: Запрос, связанный с набором записей, должен извлекать данные из одной исходной таблицы; т.е. в предложении from запроса, который находится в инструкции declare cursor, должна быть задана только одна таблица. В запросе не может присутствовать предложение order by; указатель набора записей не должен идентифицировать отсортированный набор строк результатов запроса. м В запросе не может присутствовать предикат distinct. Запрос не должен содержать предложения group by и having. Пользователь должен иметь привилегию delete или update (соответственно) на базовую таблицу. В базах данных компании IBM (DB2, SQL/DS) сделан еще один шаг в сторону усиления ограничений, установленных стандартом SQL1. Эти СУБД требуют, чтобы в инструкции declare cursor набор записей был явно объявлен как обновляемый. Расширенная форма инструкции declare cursor, используемая компанией IBM, изображена на рис. 17.33. Помимо того что предложение for update объявляет обновляемый набор записей, оно может также содержать имена обновляемых столбцов. Если в данном предложении присутствует список столбцов, то позиционные инструкции update, применяемые для данного набора записей, могут обновлять только эти столбцы. DECLARE CURSOR имя набора записей FOR запрос на выборку FOR UPDATE имя столбца \Рна 17.33. HHCTpyaaSiCLABE CURSOR С предложением FOR UPDATE- На практике все коммерческие СУБД, в которых имеются позиционные инструкции delete и update, применяют их аналогично тому, как это делается в СУБД
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |