powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Глобальный курсор?
10 сообщений из 10, страница 1 из 1
Глобальный курсор?
    #32404142
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать глобальный курсор в Sybase 5.0.
Необходимо примерно след.
Делаю 3 хр. проц.
1 -открывает курсор
2 - тянет данные из него
3 - закрывает его.

На оракле подобное делали с помошью глобального курсора.
Возможно ли что-то родственное в Sybase?
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404154
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sybase ASA | ASE | IQ 5.0 ???

Для ASA никак. Попробуйте по другому - открывайте, работайте и закрывайте курсор во второй ХП. Можете даже попробовать цикл работы с курсорами FOR, очень удобно.
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404389
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я уже сделал иначе.
Передаю туда переменную, которую снаружи инкрементирую перед каждым вызовом. В процедуре открываю курсор, позиционирую на указанную строку и тяну. После вытягивания строки закрываю. Все в одной процедуре.
Но хочется сделать красивее .... Смущает постоянное открытие-закрытие курсора.
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404397
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вдогонку.
А что за ASA? При инсталляции писал Sybase SQL Anyware 5.0 ...
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404422
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA сокращенное название Anywhere Studio :)

А можно поподробнее о том, что у Вас происходит в этих процедурах. Мне кажется, что наверное все полегче можно сделать.
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404560
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот моя процедура. Это рабочая версия с сервера.
Смущает открытие-закрытие курсора при каждом обращении.

CREATE FUNCTION ASCRgetDataByPeriodAndId(in periodBegin char(30),in periodEnd char(30), in arg_RowNum integer)
RETURNS CHAR(1024)
% Считывает из таблицы ArcOrder строку данных с указанным номером за указанный период.
% При вызовах период д.б. одинаковый, а номер увеличиваться на 1.
% Начальный номер - 1.
% возвращает строку с XML-тегом, атрибуты которого содержат информацию
% из указанной строки таблицы.
% Если возвращена пустая строка, то данных больше нет.
BEGIN
DECLARE ascrDataCursor dynamic scroll cursor for
SELECT dtBegin,dtEnd,dtGet,dtOrder,dlitAB,Category,numTlfA,
numTlfB1,numTlfB2,numTlfB3,numTlfB4,numTlfB5,SerCount,
caPrefix,caStartP,caDirect,caCodeIn,LinkA,
cbPrefix,cbStartP,cbDirect,cbCodeIn,LinkB
FROM "DBA".ArcOrder
WHERE dtBegin>=CAST(periodBegin AS TIMESTAMP) AND
dtEnd<=CAST(periodEnd AS TIMESTAMP);

declare err_notfound exception for sqlstate value '02000';
declare var_dtBegin timestamp;
declare var_dtEnd timestamp;
declare var_dtGet timestamp;
declare var_dtOrder timestamp;
declare var_dlitAB smallint;
declare var_Category smallint;
declare var_numTlfA char(21);
declare var_numTlfB1 char(21);
declare var_numTlfB2 char(21);
declare var_numTlfB3 char(21);
declare var_numTlfB4 char(21);
declare var_numTlfB5 char(21);
declare var_SerCount char(31);
declare var_caPrefix char(6);
declare var_caStartP char(6);
declare var_caDirect char(11);
declare var_caCodeIn char(11);
declare var_LinkA smallint;
declare var_cbPrefix char(6);
declare var_cbStartP char(6);
declare var_cbDirect char(11);
declare var_cbCodeIn char(11);
declare var_LinkB smallint;
declare var_Id_data integer;
declare xmlString char(1024);

OPEN ascrDataCursor;

SET xmlString = '';

% вытащить данные по услуге
FETCH ABSOLUTE arg_RowNum ascrDataCursor INTO var_dtBegin,var_dtEnd,
var_dtGet,var_dtOrder,var_dlitAB,var_Category,var_numTlfA,
var_numTlfB1,var_numTlfB2,var_numTlfB3,var_numTlfB4,var_numTlfB5,
var_SerCount,var_caPrefix,var_caStartP,
var_caDirect,var_caCodeIn,var_LinkA,var_cbPrefix,
var_cbStartP,var_cbDirect,var_cbCodeIn,var_LinkB;

IF sqlstate<>err_notfound THEN
SET xmlString = '<uslData dtBegin="' || var_dtBegin || '" dtEnd="' || var_dtEnd ||
'" dtGet="' || var_dtGet || '" dtOrder="' || var_dtOrder ||
'" dlitAB="' || var_dlitAB || '" Category="' || var_Category ||
'" numTlfA="' || var_numTlfA ||
'" numTlfB1="' || var_numTlfB1 || '" numTlfB2="' || var_numTlfB2 ||
'" numTlfB3="' || var_numTlfB3 || '" numTlfB4="' || var_numTlfB4 ||
'" numTlfB5="' || var_numTlfB5 || '" SerCount="' || var_SerCount ||
'" caPrefix="' || var_caPrefix || '" caStartP="' || var_caStartP ||
'" caDirect="' || var_caDirect || '" caCodeIn="' || var_caCodeIn ||
'" LinkA="' || var_LinkA || '" cbPrefix="' || var_cbPrefix ||
'" cbStartP="' || var_cbStartP || '" cbDirect="' || var_cbDirect ||
'" cbCodeIn="' || var_cbCodeIn || '" linkB="' || var_LinkB || '">';
END IF;

CLOSE ascrDataCursor;

RETURN(xmlString);
END;
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404583
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вариация OPEN cursorName WITH HOLD. Примеров использования не могу никак найти.
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404604
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, эт Вы зря так намудрили. Давайте по порядку:

1. У Вас запрос для возвращения курсора не сортируется. То есть гарантий, что записи с таблицы ArcOrder будут возвращены в нужном порядке и аргумент arg_RowNum будет указывать на правильную запись абсолютно нет. В ASA 5 так прокатывает, но при переводе на новые версии ASA Вас будут при таком подходе ждать куча интересных сюрпризов.

2. Курсор действительно плохо. Идут затраты на его открытие/закрытие. Плюс каждый раз при открытие курсора Вы выполняете полностью запрос, тратиться память на сохранение всех записей в курсоре и это все из за одной какой то записи. Если бы Вы передавали в функцию не абсолютный номер записи, а значение Primary Key таблицы ArcOrder, то Вы спокойно могли бы воспользоваться конструкцией:
Код: plaintext
1.
2.
3.
4.
SELECT Field1, Field2
INTO Var1, Var2
FROM ArcOrder 
WHERE ID = arg_RowID; 

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

3. В Вашей функции я не вижу ничего такого, что мотивировало бы ее существование. Мне кажется, что гораздо легче вместо нее сделать view с полями ID, dtBegin, dtEnd и вычисляемым полем xmlString. Тогда Вам достаточно всего лишь пользоваться этим представлением в запросах, соединяя нужные записи по ID и фильтруя по датам. Это позволит ASA включить оптимизатор запросов в работу и ускорить выполнение задачи. В общем тут мое мнение, что функция не нужна и уж тем более курсор в ней.

IMHO: Вам надо переделать логику этого куска, если будут дополнительные вопросы, с удовольствием отвечу.
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32404695
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, подумаю.
Это было сделано на скорую руку - дать быстрей результат. Я его и дал.
Теперь пытаюсь улучшить.
...
Рейтинг: 0 / 0
Глобальный курсор?
    #32405344
TonyRamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока и так вроде всех устраивает, а потом время покажет.
Спасибо.
Пока вопрос закрыт.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Глобальный курсор?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]