Cursor
представляет курсор базы данных для определенного SQL выражения SELECT
.
Объект server-side | |
Реализовано в | LiveWire 1.0 |
Создание
Методом cursor
объекта Connection
или объекта database
. Вы не вызываете конструктор Cursor
.
Описание
Запрос к базе данных, как говорят, возвращает Cursor
. Вы можете думать о Курсоре как о виртуальной таблице, со строками и столбцами, определенными запросом. Курсор также имеет понятие текущей строки, которая является по существу указателем на строку в виртуальной таблице. Когда Вы выполняете операции с объектом Cursor
, они обычно воздействуют на текущую строку.
Вы можете выполнять следующие задачи с объектом Cursor
:
Cursor
, чтобы настроить вид виртуальной таблицы, определяя какие столбцы и строки отобразить и как их отобразить. Объект Cursor
автоматически не отображает данные, возвращенные в виртуальной таблице. Чтобы отобразить эти данные, Вы должны создать код HTML типа показанного в Примере 4 для метода cursor
.
Важно
Курсор базы данных не гарантирует порядок или позиционирование строк. Например, если Вы имеете модифицируемый курсор и добавляете строку к курсору, Вы не можете узнать, где эта строка появится в курсоре.
Когда закончена работа с объектом Cursor
, используйте close
метод, чтобы закрыть ето и освободить память, которую он использует. Если Вы выпускаете подключение, которое имеет открытый курсор, двигатель времени выполнения ждет, пока курсор не будет закрыт перед фактическим освобождением подключения.
Обратите внимение
Каждая Sybase таблица, которую Вы используете с курсором, должна иметь уникальный индекс.
| Массив объектов, соответствующих столбцам в курсоре. |
|
Позволяет добавление свойств к объекту Cursor .
|
Свойства
Этот раздел описывает свойства объектов cursor
.
ПРИМЕЧАНИЕ:
В отличие от других свойств в JavaScript, свойства cursor
соответствующие именам столбцов не чувствительны к регистру, потому что SQL не чувствителен к регистру и некоторые базы данных не чувствительны к регистру.
Вы можете также ссылаться к свойствам объекта Cursor
как к элементам массива. 0-ой элемент массива соответствует первому столбцу, 1-ый элемент массива соответствует второму столбцу, и так далее.
cursorColumn
Массив объектов, соответствующих столбцам в курсоре.
Свойство объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Примеры
Пример 1: Использование заголовков столбца как свойства курсора. Следующий пример создает объект customerSet
типа Cursor
, содержащий строки id
, name
и city
из таблицы customer
. Метод next
перемещает указатель к первой строке курсора. Столбцы id
, name
и city
стали свойствами customerSet.id
, customerSet.name
и customerSet.city
объекта cursor
. Так как указатель находится в первой строке курсора, метод write
показывает значения этих свойств для первой строки.
// Создаем объект Cursor
customerSet = database.cursor("SELECT id, name, city FROM customer")// Переходим к первой строке
customerSet.next()write(customerSet.id + "<BR>")
write(customerSet.name + "<BR>")
write(customerSet.city + "<BR>")// Закрываем курсор
Этот запрос мог бы возвратить виртуальную таблицу, содержащую следующие строки:
customerSet.close()
1 John Smith Anytown
Пример 2: Выполнение итераций со свойствами курсора. В этом примере, массив свойств объекта
2 Fred Flintstone Bedrock
3 George Jetson Spacelycursor
используется в выражении for
, чтобы выполнить итерации над каждым столбцом курсора customerSet
.
// Создаем объект Cursor
customerSet = database.cursor("SELECT id, name, city FROM customer")// Переходим к первой строке
customerSet.next()// Начало цикла for
for ( var i = 0; i < customerSet.columns(); i++) {
write(customerSet[i] + "<BR>") }// Закрываем курсор
Так как инструкция
customerSet.close()next
перемещает указатель к первой строке, предшествующий код, показывает значения, подобные следующему:
1
Пример 3. Использование свойств курсора с составным выражением. В этом примере, курсор
John Smith
AnytownsalarySet
содержит столбец, созданный агрегатной функцией MAX.
salarySet = database.cursor("SELECT name, MAX(salary) FROM employee")
Из за того, что составной столбец не имеет имени, Вы должны использовать индекс, следующим образом:
write(salarySet[1])
prototype
Представляет прототип для этого класса. Вы можете использовать прототип, чтобы добавлять свойства или методы ко всем образцам класса. Для информации о прототипах, смотрите Function.prototype
.
Свойство объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Методы
close
Закрывает курсор и освобождает распределенную память.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
close()
Параметры
Нет.
Возвращает
0, если запрос был успешен; иначе, ненулевой код состояния, основанный на любом сообщении об ошибках, переданном базой данных. Если метод возвращает ненулевой код состояния, используйте связанные методы majorErrorCode
и majorErrorMessage
, чтобы интерпретировать причину ошибки.
Описание
Метод close
закрывает курсор или набор результатов и освобождает используемую память. Если Вы явно не закрываете курсор или набор результатов методом close
, двигатель времени выполнения JavaScript на сервере автоматически закрывает все открытые курсоры и наборы результатов, когда соответствующий объект client
выходит из области видимости.
Примеры
Следующий пример создает курсор rentalSet
, выполняет некоторые операции с ним, и затем закрывает его методом close
.
// Создаем объект Cursor
rentalSet = database.cursor("SELECT * FROM rentals")// Выполняем операции с курсором
cursorOperations()// Закрываем курсор
err = rentalSet.close()columnName
Возвращает имя столбца в курсоре, соответствующего определенному номеру.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
columnName (n)
Параметры
n | Нуль-основанное целое число, соответствующее столбцу в запросе. Первый столбец в наборе результатов 0, второй 1, и так далее. |
custs = connobj.cursor ("select * from customer");
Если таблица customer имеет 3 столбца, ID, NAME и CITY, Вы не можете сказать раньше срока, который из этих столбцов соответствует custs.columnName(0)
. (Конечно, Вам гарантируют, что последовательные вызовы columnName
имеют тот же самый результат.) Если порядок имеет значение для Вас, Вы можете взамен жестко задать имена столбцов в выражении SELECT, как в следующем выражении:
custs = connobj.cursor ("select ID, NAME, CITY from customer");
С этим выражением, custs.columnName(0)
равно ID, custs.columnName(1)
равно NAME, и custs.columnName(2)
равно CITY.
Примеры
Следующий пример присваивает имя первого столбца курсора customerSet
переменной header
:
customerSet=database.cursor(SELECT * FROM customer ORDER BY name)
header = customerSet.columnName(0)columns
Возвращает число столбцов в курсоре.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
columns()
Параметры
Нет.
Возвращает
Число именованных и неименованных столбцов.
Примеры
Смотрите Пример 2 объекта Cursor
для примера использования метода columns
с массивом cursorColumn
.
Следующий пример возвращает число столбцов в курсоре custs
:
custs.columns()
deleteRow
Удаляет текущую строку в определенной таблице.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
deleteRow (table)
Параметры
table | Строка, определяющая имя таблицы, для удаления строки. |
Возвращает
0, если запрос был успешен; иначе, ненулевой код состояния, основанный на любом сообщении об ошибках, переданном базой данных. Если метод возвращает ненулевой код состояния, используйте связанные методы majorErrorCode
и majorErrorMessage
, чтобы интерпретировать причину ошибки.
Описание
Метод deleteRow
использует модифицируемый курсор, чтобы удалить текущую строку из определенной таблицы. Смотрите Cursor
для информации о создания модифицируемого курсора.
Примеры
В следующем примере, метод deleteRow
удаляет заказчика из база данных customer
. Метод cursor
создает курсор customerSet
, содержащий одну строку; значение для customer.ID
передается как свойство объекта request
. Метод next
перемещает указатель на единственную строку в курсоре, а метод deleteRow
удаляет строку.
database.beginTransaction()
В этом примере, метод
customerSet = database.cursor("select * from customer where
customer.ID = " + request.ID, true)
customerSet.next()
statusCode = customerSet.deleteRow("customer")
customerSet.close()
if (statusCode == 0) {
database.commitTransaction() }
else {
database.rollbackTransaction() }deleteRow
устанавливает значение statusCode
, чтобы указать успешен ли deleteRow
или терпит неудачу. Если statusCode
равно 0, метод успешен, и транзакция совершается; иначе, транзакция прокручивается обратно.
insertRow
Вставляет новую строку в определенную таблицу.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
insertRow (table)
Параметры
table | Строка, определяющая имя таблицы, для вставки строки. |
Возвращает
0, если запрос был успешен; иначе, ненулевой код состояния, основанный на любом сообщении об ошибках, переданном базой данных. Если метод возвращает ненулевой код состояния, используйте связанные методы majorErrorCode
и majorErrorMessage
, чтобы интерпретировать причину ошибки.
Описание
Метод insertRow
использует модифицируемый курсор, чтобы вставить строку в определенную таблицу. Смотрите метод cursor
для информации о создании модифицируемого курсора.
Вы можете определять значения для строки, которую Вы вставляете следующим образом:
Метод
insertRow
вставляет null значение в любые столбцы таблицы, которые не появляются в курсоре.
Метод insertRow
возвращает код состояния, основанный на сообщении сервера баз данных, чтобы указать, завершился ли метод успешно. Если успешно, метод возвращает 0; иначе, он возвращает ненулевое целое число, чтобы указать причину его неудачи. Смотрите Writing Server-Side JavaScript Applications для объяснения кодов состояния.
Примеры
В некоторых приложениях, типа приложения с арендной платой за видео, муж, жена и дети могли бы иметь общий номер счета, но быть перечисленными под различными именами. В этом примере, пользователь только добавил имя к таблице accounts
и хочет добавить имя супруги к этому же счету.
customerSet = database.cursor("select * from customer", true)
x=true
while (x) {
x = customerSet.next() }customerSet.name = request.theName
В этом примере, метод
customerSet.insertRow("accounts")
customerSet.close()next
переходит к последней строке в таблице, которая содержит последний добавленный счет. Значение theName
передано объекту request
и присвоено столбцу name
в курсоре customerSet
. Метод insertRow
вставляет новую строку в конец таблицы. Значение столбца name
в новой строке равно значению theName
. Так как приложение использовало метод next
для перемещения, значение каждого другого столбца в новой строке такое же, как и значение в предыдущей строке.
next
Перемещает текущую строку к следующей строке в курсоре.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
next()
Параметры
Нет.
Возвращает
False, если текущая строка это последняя строка; иначе, true.
Описание
Первоначально, указатель (или текущая строка) для курсора или набора результатов установлен перед первой возвращенной строкой. Используйте метод next
, чтобы перемещать указатель по записям в наборе результатов или курсоре. Этот метод перемещает указатель на следующую строку и возвращает истину пока имеется другая доступная строка. Когда курсор или набор результатов достигает последней строки, метод возвращает false. Обратите внимение, что если курсор пуст, этот метод всегда возвращает false.
Примеры
Пример 1. Этот пример использует метод next
, чтобы перейти к последней строке в курсоре. Переменная x
инициализирована в true. Когда указатель находится в последней строке курсора, метод next
возвращает false и завершает цикл while
.
customerSet = database.cursor("select * from customer", true)
x = true
Пример 2. В следующем примере, курсор
while (x) {
x = customerSet.next() }rentalSet
содержит столбцы, с именами videoId
, rentalDate
и dueDate
. Метод next
вызывается в цикле while
, который выполняет итерации над каждой строкой в курсоре. Когда указатель находится на последней строке в курсоре, метод next
возвращает false и завершает цикл while
.
Этот пример показывает три столбца курсора в таблице HTML:
<SERVER>
// Создаем объект Cursor
rentalSet = database.cursor("SELECT videoId, rentalDate, returnDate
FROM rentals")
</SERVER>// Создаем таблицу HTML
<TABLE BORDER>
<TR>
<TH>Video ID</TH>
<TD>Rental Date</TD>
<TD>Due Date</TD>
</TR><SERVER>
// Выполняем итерации с каждой строкой в курсоре
while (rentalSet.next()) {
</SERVER>// Отображаем значения курсора в таблице HTML
<TR>
<TH><SERVER>write(rentalSet.videoId)</SERVER></TH>
<TD><SERVER>write(rentalSet.rentalDate)</SERVER></TD>
<TD><SERVER>write(rentalSet.returnDate)</SERVER></TD>
</TR>// Завершаем цикл while
<SERVER>
}
</SERVER>// Конец таблицы
</TABLE>updateRow
Модифицирует записи в текущей строке определенной таблицы в курсоре.
Метод объекта |
Cursor
|
Реализовано в | LiveWire 1.0 |
Синтаксис
updateRow (table)
Параметры
table | Строка, определяющая имя таблицы, для модификации. |
Возвращает
0, если запрос был успешен; иначе, ненулевой код состояния, основанный на любом сообщении об ошибках, переданном базой данных. Если метод возвращает ненулевой код состояния, используйте связанные методы majorErrorCode
и majorErrorMessage
, чтобы интерпретировать причину ошибки.
Описание
Метод updateRow
позволяет Вам использовать значения в текущей строке модифицируемого курсора, чтобы изменить таблицу. Смотрите метод cursor
для информации о создании модифицируемого курсора. Перед выполнением updateRow
, Вы должны выполнить по крайней мере один раз next
с курсором, так чтобы текущая строка установилась на первой строке.
Метод updateRow
возвращает код состояния, основанный на сообщении сервера баз данных, чтобы указать, завершился ли метод успешно. Если успешно, метод возвращает 0; иначе, он возвращает ненулевое целое число, чтобы указать причину его неудачи. Смотрите Writing Server-Side JavaScript Applications для объяснения индивидуальных кодов состояния.
Примеры
Этот пример использует updateRow
, чтобы модифицировать столбец returndate
таблицы rentals
. Значения customerID
и videoID
передаются методу cursor
как свойства объекта request
. Когда объект videoReturn
типа Cursor
открывается, метод next
переходит к единственной возвращенной записи и модифицирует значение в поле returnDate
.
// Создаем курсор, содержащий арендованное видео
videoReturn = database.cursor("SELECT * FROM rentals WHERE
customerId = " + request.customerID + " AND
videoId = " + request.videoID, true)// Устанавливаем указатель на первой строке курсора
videoReturn.next()// Присваиваем текущую дату столбцу returndate
videoReturn.returndate = today// Модифицируем строку
videoReturn.updateRow("rentals")
Последняя Модификация: 10/31/97 16:36:13
Все мессаги сюда:yanich@inbox.ru |