Обработка неопределенных значений — КиберПедия 

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Обработка неопределенных значений

2020-06-02 138
Обработка неопределенных значений 0.00 из 5.00 0 оценок
Заказать работу

Поскольку SQL-данные могут быть неопределенными значениями, необходимо решить, как представлять их в XML-документе. Неопределенные значения могут быть представлены либо как нуль, либо как отсутствие всякого значения. Если элемент столбца необходимо представить как неопределенное (нулевое) значение, то он будет иметь атрибут xsi:nil="true". Это может быть сделано следующим способом:

<row><FirstName>Bill</FirstName><LastName>Bailey</LastName><City xsi:nil="true" /><AreaCode>714</AreaCode><Telephone>5 55-22 22</Telephone></row>

Если элемент столбца отсутствует, то выполните следующее:

<row><FirstName>Bill</FirstName><Las tName>Bailey</Las tName><AreaCode>714</AreaCode><Telephone>55 5-22 22</Telephone></row>

При выборе этой опции строка содержит неопределенное значение, которое "отсутствует". С ним нет связей.

Создание XML-схемы

При преобразовании данных из SQL в XML первый созданный документ содержит данные, а второй – информацию о схеме. В качестве примера рассмотрим схему для документа CUSTOMER (см. "Преобразование таблиц").

<xsd:schema><xsd:simpleType name="CHAR_15"><xsd:restriction base="xsd:string"><xsd:lenght value = "15"/></xsd;restriction></xsd:simpleType><xsd:simpleType name="CHAR_25"><xsd:restriction base="xsd:string"><xsd:lenght value = "25"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="CHAR_3"><xsd:restriction base="xsd:string"><xsd:lenght value = "3"/></xsd:restriction></xsd:simpleType><xsd:simpleType name-"CHAR_8"><xsd:restriction base="xsd:string"><xsd:lenght value = "8"/></xsd:restriction></xsd:simpleType><xsd:sequence><xsd:element name="FirstName" type="CHAR_15"/><xsd:element name="LastName" type="CHAR_25"/><xsd:elementname="City" type="CHAR_25" nillable="true"/><xsd:elementname="AreaCode" type="CHAR_3" nillable="true"/><xsd:elementname="Telephon" type="CHAR_8" nillable="true"/><xsd:sequence></xsd:schema>

Эта схема подходит в том случае, если при обработке неопределенных значений используется опция "нуль". Опция "отсутствие" требует несколько иного определения элемента. Например:

<xsd:elementname="City" type="CHAR_25 minOccurs="0"/>

Получение XML результатов при использовании операторов SQL

SQL: 2003 имеет пять операторов, XMLELEMENT, XMLFOREST, XMLGEN, XMLCONCAT и XMLAGG, которые при применении к содержимому базы данных SQL дают XML-результат.

Оператор XMLELEMENT

Оператор XMLELEMENT создает XML-элемент. Этот оператор может использоваться в операторе SELECT для помещения данных формата XML в базу данных SQL. Рассмотрим следующий пример:

SELECT с.LastName

XMLELEMENT (NAME "City", c.City) AS "Result"

FROM CUSTOMER С

WHERE LastName="Abelson";

Возвращаемый результат:

LastName Result
Abelson <City>Springfield</City>

Оператор XMLFOREST

Оператор XMLFOREST создает дерево (forest) элементов из списка аргументов. Каждый аргумент оператора создает новый элемент. Ниже приведен пример использования такого оператора.

SELECT с. LastNartie

XMLFOREST (с.City,

с.AreaCode,

с.Telephone) AS "Result"

FROM CUSTOMER с

WHERE LastName="Abelson" OR LastName="Bailey";

В результате вы получите следующую информацию:

LastName Result
Abelson <City>Springfield</City> <AreaCode>714</AreaCode> <Telephone>555-llll</ Telephone>
Bailey <City>Decatur</City> <AreaCode>714</AreaCode> <Telephone>555-llll</ Telephone>

Оператор XMLGEN

Первый аргумент оператора XMLGEN – это шаблон, который содержит символы-заполнители для значений, которые будут добавлены позже. Символы-заполнители представлены в форме "{$name}". Последовательность аргументов задает значения и связанные с ними имена, которые характеризуют шаблон. Ниже приведен пример использования этого оператора.

SELECT с.LastName

XMLGEN ('<CUSTOMER Name="{$LASTNAME}">

<City>{$CITY}</City>

</CUSTOMERS,

c.LastName AS Name,

с City) AS "Result"

FROM CUSTOMER с

WHERE LastName="Abelson" OR LastName="Bailey";

Результат будет следующим:

LastName Result
Abelson <CUSTOMER Name="Abelson" <City>Springfield</City> </CUSTOMER>
Bailey <CUSTOMER Name="Bailey" <City>Decatur</City> </CUSTOMER>

Оператор XMLCONCAT

Оператор XMLCONCAT обеспечивает альтернативный способ создания дерева элементов. Это осуществляется путем связывания его XML-аргументов. Например:

SELECT с.LastName

XMLCONCAT (

XMLELEMENT (NAME "first", c.FirstName,

XMLELEMENT (NAME "last", c.LastName)

) AS "Result" FROM CUSTOMER с;

В результате получится следующее:

LastName Result
Abelson <first>Abe</first> <last>Abelson</last>
Bailey <first>Bill</first> <last>Bailey</last>

Оператор XMLAGG

XMLAGG – это агрегирующая функция, которая создает единственный XML-документ из других XML-документов или их отдельных фрагментов. Агрегирование содержит дерево элементов. Рассмотрим это на примере:

SELECT XMLELEMENT

(NAME "City",

XMLATTRIBUTES (с.City AS "name"),

XMLLAGG (XMLELEMENT (NAME "last" c.LastNa,e)

)

) AS "CityList"

FROM CUSTOMER С

GROUP BY City;

При обработке таблицы CUSTOMER этот запрос выведет следующее:

<City name="Decatur">

<last>Bailey</last>

</City>

<City name= "Philo">

<last>Stetson</last>

<last>Stetson</last>

<last>Wood</last>

</City

<City name="Springfield">

<last>Abelson</last>

</City>

Преобразование не предопределенных типов данных в XML

В SQL:2003 к не предопределенным типам данных относятся домены, отдельные UDT-типы, строки, массивы и мультимножества. Для преобразования каждого из этих XML-типов данных используется соответствующий XML-код. Примеры преобразования таких типов данных рассматриваются в следующих разделах.

Домены

Для того чтобы преобразовать SQL-домен в XML, вначале этот домен необходимо создать. Для создания домена воспользуемся оператором CREATE DOMAIN:

CREATE DOMAIN WestCoast AS CHAR (2)

CHECK (State IN ('CA\ 'OR1, ' WA', ' AK '));

Теперь создадим таблицу, которая использует этот домен:

CREATE TABLE WestRegion (

ClientName Character (20) NOT NULL,
State WestCoast NOT NULL

);

Ниже приведена XML-схема преобразования домена в XML.

<xsd:simpleType>

Name='DOMAIN.SalesWestCoast'>

<xsd:annotation> <xsd:appinfo>

<sqlxml:sqltype kind='DOMAIN'

schemaName='Sales'

typeName='WestCoast'

mappedType='CHAR_2'

finals'true'/>

<xsd:appinfo>

</xsd:annotation>

<xsd:restriction base='CHAR_2'/>

</xsd:simpleType>

После применения этого преобразования вы получите XML-документ примерно следующего содержания:

<WestRegion>

<row>

.

.

.

State>AK</State>

.

.

.

</row>

.

.

.

</WestRegion>

Отдельные UDT-типы

С отдельными UDT-типами вы можете делать то же самое, что и с доменами, однако здесь необходим более строгий подход к определению типа. Например:

CREATE TYPE WestCoast AS Character (2) FINAL;

Для преобразования этого типа в XML-тип используется следующая XML-схема:

<xsd:simpleType>

Name='UDT.SalesWestCoast'>

<xsd:annotation>

<xsd:appinfo>

<sqlxml:sqltype kind='DISTINCT'

schemaName='Sales'

typeName='WestCoast'

mappedType='CHAR_2'

final='true'/>

<xsd:appinfo>

</xsd:annotation>

<xsd:restriction base='CHAR_2'/>

</xsd:simpleType>

В результате создается элемент, похожий на созданный для домена, описанного нами ранее.

Строки

Тип ROW позволяет поместить целую строку с ценной информацией в одно лишь отдельное поле строки таблицы. Тип ROW создается как часть описания таблицы следующим образом:

CREATE TABLE CONTACTINFO (

Name CHARACTER (30)
Phone ROW (Home CHAR (13), Work CHAR (13))

Теперь воспользуемся следующей XML-схемой для преобразования этого типа:

<xsd:complexType Name='ROW.1'>

<xsd:annotation>

<xsd:appinfo>

<sqlxml:sqltype kind='ROW'

<sqlxml:field name='Home'

mappedType='CHAR_13'/>

<sqlxml:field name='Work'

mappedType='CHAR_13'/>

</sqlxml:sqltype>

<xsd:appinfo>

</xsd:annotation>

<xsd:sequence>

<xsd:element Name='Home' nillable='true'

Type='CHAR_13'/>

<xsd:element Name='Work' nillable='true'

Type='CHAR_13'/>

</xsd:sequence>

</xsd:complexType>

Такое преобразование создает для столбца следующий XML-тип:

<Phone>

<Home>(888)555-llll</Home>

<Work>(888)555-1212</Work>

</Phone>

Массивы

Если вы хотите поместить в одно поле больше одного элемента, вместо типа ROW воспользуйтесь типом Array. Для этого примера в таблице CONTACTINFO объявим столбец Phone как массив, а затем создадим XML-схему, которая будет преобразовывать массив в XML:

Например:

CREATE TABLE CONTACTINFO (

Name CHARACTER (30)
Phone CHARACTER (13) ARRAY [4]

);

Теперь воспользуемся следующей XML-схемой для преобразования этого типа:

<xsd:complexType Name='ARRAY_4.CHAR_13'>

<xsd:annotation>

<xsd:appinfo>

<sqlxml:sqltype kind='ARRAY1

maxElements='4'

mappedElementType='CHAR_13'/>

</xsd:appinfo>

</xsd:annotation>

<xsd:sequence>

<xsd:element Name='element'

minOccurs='0' maxOccurs='4'

nillable='true' type='CHAR_13'/>

</xsd:sequence >

</xsd:complexType>

Результат будет примерно следующим:

<Phone>

<element>(888)555-llll</element>

<element>xsi:nil='true'/>

<element>(888)555-3434</element>

</Phone>

Элемент в массиве, содержащий xsi:nil='true', говорит о том, что второй телефонный номер в исходной таблице содержит неопределенное значение.

Мультимножества

Номера телефонов из предыдущего примера могут также хорошо храниться и в мультимножествах. Для преобразования мультимножества воспользуемся следующим программным кодом:

CREATE TABLE CONTACTINFO (

Name CHARACTER (30)
Phone CHARACTER (13) MULTISET

);

Преобразуем этот тип в XML с помощью такой схемы:

<xsd:complexType Name='MULTISET.CHAR_13'>

<xsd:annotation>

<xsd:appinfo>

<sqlxml:sqltype kind='MULTISET'

mappedElementType='CHAR_13'/>

</xsd: appinfo>

</xsd:annotation>

<xsd:sequence>

<xsd:element Name='element'

minOccurs='0' maxOccurs='unbounded'

nillable='true' type='CHAR_13'/>

</xsd:sequence >

</xsd:complexType>

Результат будет примерно следующим:

<Phone>

<element>(888)555-llll</element>

<element>xsi:nils' true'I>

<element>(888)555-3434</element>

</Phone>


 

Курсоры

В этой главе…

· Определение области действия курсора в операторе declare

· Открытие курсора

· Построчная выборка данных

· Закрытие курсора

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

По существу, курсор является указателем на определенную строку таблицы. С его помощью можно вывести, обновить или удалить строку, на которую он ссылается.

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

В случае использования встроенного SQL в общем все выглядит так:

EXEC SQL DECLARE CURSOR выражениеEXEC SQL OPEN выражениеПроверка достижения конца таблицыПрограммный кодНачало циклаПрограммный кодEXEC SQL FETCHПрограммный кодПроверка достижения конца таблицыКонец циклаEXEC SQL CLOSE выражениеПрограммный код

В приведенном фрагменте кода командами SQL являются: DECLARE (объявить), OPEN (открыть), FETCH (вызвать) и CLOSE (закрыть). Каждая из этих команд детально рассматривается в этой главе.

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

Объявление курсора

Чтобы использовать курсор, необходимо сначала объявить о его существовании СУБД. Это делается с помощью оператора DECLARE CURSOR. Фактически она не инициирует никакого действия, а только объявляет имя курсора для СУБД и определяет запрос, с которым будет работать курсор. Синтаксис оператора DECLARE CURSOR имеет следующий вид:

DECLARE имя_курсора [<чувствительность>][<перемещаемость>]CURSOR [<состояние_фиксации>] [<возвращаемость>]FOR выражение_запроса[ORDER BY порядок_сортировки][FOR разрешение_обновления];

Примечание:
имя курсора однозначно определяет курсор, следовательно, оно должно отличаться от любого другого имени курсора в модуле или программе
.

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

Совет:
Чувствительность курсора может быть установлена в состояние SENSITIVE, INSENSITIVE или ASENSITIVE. Перемещаемость курсора может быть в состоянии SCROLL (с прокруткой) или NO SCROLL (без прокрутки). Состояние фиксации курсора может быть либо WITH HOLD (с фиксацией), либо WITHOUT HOLD (без фиксации), а возвращаемость – WITH RETURN (с возвратом) либо WITHOUT RETURN (без возврата)
.

Выражение запроса

Выражением запроса может быть любой допустимый оператор SELECT. Оператор SELECT выводит строку, на которую указывает курсор в данный конкретный момент времени. Эти строки представляют собой область действия курсора.

Помни:
Запрос не будет выполняться сразу же после выполнения оператора DECLARE CURSOR. Выборка данных обязательно начинается с оператора OPEN. Построчная обработка данных осуществляется в цикле с использованием оператора FETCH.

Предложение ORDER BY

В зависимости от того, что программный код должен делать с данными, иногда требуется обрабатывать выбранные данные в определенном порядке. Сортировку строк перед их обработкой можно выполнять с помощью предложения ORDER BY (упорядочить по). Его синтаксис имеет следующий вид:

ORDER BY спецификация_сортировки [, спецификация_сортировки]…

Существует множество спецификаций сортировки, каждая из которых имеет следующий синтаксис:

(имя_столбца) [ COLLATE BY имя_сопоставления ] [ ASC | DESC ]

Для сортировки по столбцу данный столбец должен присутствовать в списке выборки в выражении запроса. Сортировку по столбцам таблицы, не вошедшим в список запроса, выполнить нельзя. Например, требуется произвести операцию, не поддерживаемую SQL, со строками таблицы CUSTOMER. В данном случае можно использовать курсор:

DECLARE custl CURSOR FORSELECT CustID, FirstName,LastName, City, State, PhoneFROM CUSTOMERORDER BY State, LastName, FirstName

В этом примере оператор SELECT выводит строки, упорядоченные вначале по штату (State), затем по фамилии (LastName) и по имени (FirstName). Перед тем как перейти к первому заказчику из штата Алабама (AL), выбираются все заказчики из штата Аляска (АК). Затем все записи о заказчиках из Аляски сортируются по их фамилиям (Aaron предшествует Abbot). Там, где фамилии совпадают, сортировка производится по имени (George Aaron предшествует Нету Aaron).

Приходилось ли вам когда-нибудь делать 40 копий документа, состоящего из 20 страниц, на копировальном аппарате без сортировщика? Ужас, до чего противная работа! Необходимо организовать место для 20 кучек, которые будут соответствовать 20 страницам документа, и ходить между ними 40 раз туда и обратно, раскладывая 40 копий по этим кучкам. Такой процесс называется сопоставлением. Аналогичный процесс возможен и в SQL.

Сопоставление – это набор правил, определяющих порядок сортировки строк данных. Сортировка по алфавитному порядку установлена по умолчанию. Однако можно выбрать отличный от установленного по умолчанию порядок, по которому будут упорядочиваться данные. Для этого следует использовать необязательный оператор COLLATE BY (использовать сопоставление). Любая реализация изначально поддерживает несколько часто встречающихся сопоставлений. Можно выбрать одно из них, указав лишь, как нужно упорядочивать данные – по возрастанию или по убыванию. Для этого в конце предложения нужно добавить ключевое слово ASC или DESC соответственно.

В операторе DECLARE CURSOR можно использовать столбец, рассчитанный на основе существующих столбцов таблицы. У такого столбца нет имени, которое может использоваться в предложении ORDER BY. Чтобы иметь возможность сослаться на этот столбец, его имя нужно определить в выражении запроса оператора DECLARE CURSOR. Рассмотрим следующий пример:

DECLARE revenue CURSOR FORSELECT Model, Units, Price,Units * Price AS ExtPriceFROM TRANSDETAILORDER BY Model, ExtPrice DESC;

В этом примере нет ни одного оператора COLLATE BY в предложении ORDER BY, таким образом, использовалось сопоставление по умолчанию. В четвертом столбце, ExtPrice (общая цена), находятся данные о совокупной цене изделий определенной модели. В предложении ORDER BY задается вначале сортировка по названию модели Model, затем по общей цене ExtPrice. Сортировка по столбцу ExtPrice производится по убыванию (ключевое слово DESC), т.е. вначале обрабатываются более дорогие транзакции.

В предложении ORDER BY по умолчанию используется порядок сортировки по возрастанию. Если в списке спецификаций присутствует сортировка DESC и следующая сортировка также должна производиться по убыванию, для нее следует указать ключевое слово DESC в явном виде. Например, выражение:

ORDER BY А, В DESC, С, D, E, F

…эквивалентно такому:

ORDER BY A ASC, В DESC, С ASC, D ASC, E ASC, F ASC

Разрешение обновления

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

FOR READ ONLY

Для разрешения обновления избранных столбцов, при том, что остальные столбцы должны быть защищены, используйте:

FOR UPDATE OF имя_столбца [, имя_столбца]…

Помни:
Естественно, столбцы, внесенные в приведенный список, должны присутствовать в выражении запроса оператора DECLARE CURSOR. Если предложение разрешения (или запрета) обновления отсутствует, по умолчанию данные всех столбцов, указанных в выражении запроса, могут быть обновлены. В этом случае оператор UPDATE может обновить все столбцы строки области действия курсора, а оператор DELETE может удалить такую строку
.

Чувствительность

Выражение запроса в операторе DECLARE CURSOR определяет строки, которые находятся в области действия курсора. Возникает вопрос: что если программный код, расположенный между операторами OPEN и CLOSE, изменяет содержимое некоторых строк так, что они перестают удовлетворять условиям запроса? А если некоторые строки вообще удалены? Продолжает ли команда курсора обрабатывать все строки, которые изначально соответствовали условиям запроса, или же изменяет свое поведение в зависимости от изменений, а может, вообще игнорирует измененные или удаленные строки?

Помни:
До окончания построчной обработки в результате запроса DECLARE CURSOR данные могут находиться в полном беспорядке. Такие данные недостоверны и противоречивы. Потому рекомендуется сделать курсор нечувствительным к любым изменениям. Для этого в оператор DECLARE CURSOR нужно добавить ключевое слово INSENSITIVE. В течение времени, когда курсор остается открытым, он нечувствителен к изменениям таблицы, так что область действия курсора распространяется на строки, соответствующие исходным условиям выражения запроса. Курсор не может быть нечувствительным и обновляемым в одно и то же время. Нечувствительный курсор должен быть открыт только для чтения
.

Обычные операторы SQL, такие как UPDATE, INSERT или DELETE, работают с набором строк таблицы базы данных, а возможно, со всеми строками таблицы. Во время работы механизм транзакций SQL защищает ее от вмешательства других команд, работающих одновременно с теми же данными. При использовании же курсора данные более уязвимы. В течение всего времени, пока курсор открыт, данные могут быть изменены другими командами. Если открывается один курсор и начинается обработка таблицы, затем открывается другой курсор, а первый курсор остается активным, действия, производимые вторым курсором, могут повлиять на данные, используемые командой первого курсора. Предположим, составлены следующие запросы:

DECLARE Cl CURSOR FOR SELECT * FROM EMPLOYEEORDER BY Salary;DECLARE C2 CURSOR FOR SELECT * FROM EMPLOYEEFOR UPDATE OF Salary;

Теперь предположим, что оба курсора открыты и командой курсора С1 последовательно выбрано несколько строк, а в это время данные по зарплате обновлены с помощью С2. При этом может так получиться, что строка, уже выбранная С1, может опять появиться при последующей выборке.

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

По умолчанию чувствительность курсора находится в состоянии ASENSITIVE. Значение ASENSITIVE зависит от реализации SQL. В одной реализации оно может быть эквивалентно SENSITIVE, а в другой – INSENSITIVE. Для того чтобы выбрать, какое значение использовать в вашей реализации, прочитайте техническую документацию к вашей системе.

Перемещаемость

Понятие перемещаемость (scrollability) впервые появилось в SQL-92. В реализациях, поддерживаемых SQL-86 и SQL-89. единственным разрешенным перемещением курсора было последовательное, начиная с первой строки, выбранной выражением запроса, и заканчивая последней строкой. Ключевое слово SCROLL оператора DECLARE CURSOR в SQL-92 (и в SQL:2OO3) позволяет получить доступ к строкам в любом порядке по вашему желанию. Синтаксис оператора FETCH контролирует перемещение курсора. Оператор FETCH мы рассмотрим ниже в этой главе.

Открытие курсора

Оператор DECLARE CURSOR определяет, какие строки включать в курсор, но фактически не инициирует никакого действия, являясь лишь объявлением. Оператор OPEN активизирует курсор. Она имеет следующий вид:

OPEN имя_курсора;

Для открытия курсора, приведенного выше в разделе, посвященном предложению ORDER BY, используйте синтаксис:

DECLARE revenue CURSOR FORSELECT Model, Units, Price,Units * Price AS ExtPriceFROM TRANSDETAILORDER BY Model, ExtPrice DESC;OPEN revenue;

Помни:
До тех пор пока курсор не открыт, осуществлять выборку строк из курсора невозможно. После открытия курсора значения переменных, содержащиеся в операторе DECLARE CURSOR, становятся фиксированными, это же относится к функциям даты-времени. Рассмотрим
следующий пример:

DECLARE CURSOR C1 FOR SELECT * FROM ORDERSWHERE ORDERS.Customer=:NAMEAND DueDate < CURRENT_DATE;NAME: = 'Acme Co'; //Выражение базового языкаOPEN C1;NAME: = 'Omega Inc.'; //Другое выражение базового языка…UPDATE ORDERS SET DueDate = CURRENT_DATE;

Оператор OPEN фиксирует значение всех переменных, приведенных в объявлении курсора, а также значения всех функций даты-времени. Поэтому второе присваивание имени переменной (NAME: = 'Omega Inc.') не влияет на выбранные курсором строки. Это значение NAME будет использоваться при последующем открытии С1. Если даже команда OPEN выполняется до полуночи, а оператор UPDATE выполняется после, значение CURRENT_DATE в операторе UPDATE вычисляется во время выполнения команды OPEN. Это справедливо даже в том случае, если в операторе DECLARE CURSOR нет функций даты-времени.


Поделиться с друзьями:

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.092 с.