Форум: "Базы";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
Внизкурсор в сохр. процедурах Найти похожие ветки
← →
Vitaliy74 (2002-06-11 14:28) [0]Здравствуйте!
Как объявлять и использовать курсоры, в сохр. процедурах, в InterBase 6.0?
← →
Johnmen (2002-06-11 14:34) [1]InterBase->Documentation->SQL Reference Help
← →
Digitman (2002-06-11 14:37) [2]в ISQL-скриптах - никак. Кусор НД - понятие , относящееся к SQL, DSQ и EmbeddedSQL, но не ISQL. Тексты же SP/триггеров реализуются именно в ISQL.
Работа с курсорами имеет смысл только на клиентской стороне (в АП процесса клиента) при открытии НД, возвращенного как результат запроса (в т.ч. и с использованием SP)
← →
Ciklon (2002-06-12 02:09) [3]Я тоже пробовал создать SP с использованием курсора - не получилось. Если в ISQL-скриптах нельзя, то как создать SP с курсором?
>Digitman, Johnmen Может сбросите в качестве примерчика какую-нибудь процедурку (для IB 6.0) для изучения ??? Плиз.
← →
Polevi (2002-06-12 10:01) [4]Попробуем еще разок
>Если в ISQL-скриптах нельзя, то как создать SP с курсором?
>в ISQL-скриптах - никак
>Тексты же SP/триггеров реализуются именно в ISQL.
← →
MM (2002-06-12 10:49) [5]a чем не подходит неявный курсор???
FOR SELECT dept_no
FROM Department
WHERE head_dept = :v_dno
INTO :rdno
DO
BEGIN
...
END
← →
kaif (2002-06-12 14:16) [6]Я тоже экспериментировал с курсорами и ничего не вышло. В MSSQL я с курсорами работал без проблем. И мне почему-то кажется (может это дежа вью), что в IB4.* я как-то курсор задействовал...А может, я путаю с MSSQL... Боюсь, что что-то здесь не так. Что значит в ISQL курсоры не работают? Теперь, что DECLARE CURSOR это конструкция языка приложений или что вообще это такое? Документация IB вопрос не проясняет. Я долго мучился, но убедился, что в IB6.0 это не работает никак.
Конструкция FOR SELECT не заменяет курсор например в такой ситуации:
1. Два курсора создаются.
2. Обходятся по какой-то логике, близкой к синхронному перемещению по ним (параллельно)
3. Два курсора удаляются.
FOR SELECT позволяет сделать только вложенные обходы. А это не решает ряд задач...
Понятно, что применение курсоров - не лучший стиль. Но иногда они были бы полезны...
← →
MM (2002-06-12 18:15) [7]>kaif
Что-то не могу придумать пример в котором неявного курсора было бы недостаточно.
Пример такого обхода есть?
← →
kaif (2002-06-13 01:37) [8]>2 MM (12.06.02 18:15)
Как-то у меня была одна задача. Одна таблица - поток приходов на склад (дата, товар, кол-во, сумма). Другая симметричная таблица - поток отгрузок с того же склада (дата, товар, кол-во, сумма). Хотелось сделать что-то вроде FIFO, не создавая дополнительных таблиц. Хранимая процедура по моим расчетам могла очень быстро в параллель обойти оба набора (синхронизируясь по товару), предварительно упорядочив наборы по (товар, дата). Так как с курсорами ничего не получилось, я поменял структуру исходной базы и сделал все иначе. Но было обидно. Зачем вообще о курсорах упоминают в том же списке, где и CREATE TABLE, ALTER TABLE, SELECT и др. команды находятся, работающие в ISQL? Я по инерции думал, что как-то можно их задействовать (я же делал это в MSSQL!). Правда в MSSQL нет таких шикарных вещей как FOR SELECT и SUSPEND. Cейчас я смирился с ситуацией и тоже не вижу задач, требующих более чем FOR SELECT.
← →
nvi (2002-06-13 09:08) [9]Собственно, понятие "курсор" для IB лишено всякого смысла, т.к. это его естественное свойство! Вот простой пример решения, взятый из реальной программы:
CREATE PROCEDURE Plan_Mes (God INTEGER, Mes INTEGER)
RETURNS (Tov INTEGER, Name CHAR(40),
Summa DECIMAL(15,2), Sum_Mes DECIMAL(15,2))
/* Отображение планов на один месяц и суммы за весь месяц */
AS BEGIN
/* Сумма за весь месяц */
SELECT SUM(Summa) FROM Plans
WHERE YearDeal=:God AND MonthDeal=:Mes
INTO :Sum_Mes;
/* Строки таблицы */
FOR SELECT P.Tov, T.Name, P.Summa
FROM Plans P, Tovar T
WHERE P.Tov=T.Tov AND
YearDeal=:God AND MonthDeal=:Mes
ORDER BY P.Name
INTO :Tov, :Name, :Summa
DO SUSPEND;
END
В IB есть "волшебный" оператор DO SUSPEND, он-то и позволяет возвращать программе сформиованнуб строку данных. Вот чего очень недостаёт всеми любимому Oracle! Очень без этого мучаюсь!
← →
alxkrp (2002-06-13 09:44) [10]Народ, я тоже пытался разобраться с этой проблемой.
Нашел на www.ibase.ru статью, в которой увидел это:
CREATE PROCEDURE TEST2
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE K INTEGER;
BEGIN
FOR SELECT ID
FROM T_EXTERNAL
INTO :ID
DO
BEGIN
K=NULL;
FOR SELECT ID FROM T_INTERNAL
WHERE ID=:ID
INTO :K
AS CURSOR TMPCURSOR
DO
UPDATE T_INTERNAL T SET T.TSTAMP=CURRENT_TIMESTAMP
WHERE CURRENT OF TMPCURSOR;
IF (K IS NULL) THEN
INSERT INTO T_INTERNAL(ID) VALUES(:ID);
END
END;
,но у меня нифига не работает.
Чего-то я не понимаю.
← →
Vitaliy74 (2002-06-13 10:33) [11]Ну, так что ДОРОГИЕ ГОСПОДА!
Можно ли подвести вывод, что курсоры в SP (IB 6.0) не работают?
Неявные курсоры для моей задачи не подходят.
Мне нужно упаковать записи в таблице, представленные в виде "лестницы", в одну или несколько строк. Данную проблему, я думаю, можно решить через курсоры.
← →
Digitman (2002-06-13 10:43) [12]>Vitaliy74
Поясни про "лестницу" и строки на конкр.примере.
Абсолютно все задачи тем или иным образом решаемы средствами ISQL-скрипта IB-сервера (+UDF !) без всяких курсоров.
P.S. Курсор нужен клиенту, а не серверу.
← →
MM (2002-06-13 11:20) [13]>>nvi
в Oracle в отл. от IB можно возвращать НД сразу. В твоем случае примерно так(CPKG - package где объявляеться курсор, если нужно и объявление пиши на форум):
CREATE OR REPLACE PROCEDURE out_cur(
...,
Result in out CPKG.GetCursor)
AS BEGIN
SELECT SUM(Summa)
INTO Sum_Mes
FROM Plans
WHERE YearDeal=God AND MonthDeal=Mes;
Open Result For
SELECT P.Tov, T.Name, P.Summa, Sum_Mes Sum_Mes
INTO Tov, Name, Summa, Sum_Mes
FROM Plans P, Tovar T
WHERE P.Tov=T.Tov AND YearDeal=God AND MonthDeal=Mes
ORDER BY P.Name
END;
>>Vitaliy74
>>Мне нужно упаковать записи в таблице, представленные в виде "лестницы", в одну или несколько строк. Данную проблему, я думаю, можно решить через курсоры.
ест-но можно. К тому же неявный курсор тебе как раз здесь и пригодиться, от того что он неявный, он ничуть не хуже явного...
← →
Vitaliy74 (2002-06-13 13:56) [14]
> Digitman
> Абсолютно все задачи тем или иным образом решаемы средствами
> ISQL-скрипта IB-сервера (+UDF !) без всяких курсоров.
Это понятно. Но тогда для любых изменений, потребуется компилятор и сам разработчик, нежели только знание SQL и все.
> Digitman, MM
Мне кажется все ушли от сути моего вопроса и, как всегда, появились вложенные дискуссии. Никто не может дать определенного
ответа?
← →
Digitman (2002-06-13 14:18) [15]
> Но тогда для любых изменений, потребуется компилятор и сам
> разработчик
Какое это имеет отношение к теме и сути твоего изначального вопроса ? imho - никакого.
О каких "изменениях" можно вести речь, если и изменять-то еще нечего ? Ты еще ничего не построил на базе "курсоров .. в сохр. процедурах", даже если бы таковые существовали.
Так что, если действительно требуется помощь или идея, не зацикливайся на курсорах, а приведи описание задачи, которую нужно решить средствами IB-сервера
← →
Vitaliy74 (2002-06-13 16:58) [16]
> Digitman
> не зацикливайся на курсорах, а приведи описание задачи,
> которую нужно решить средствами IB-сервера
Как говоритcя: "Часто дать тебе "достойный" ответ норовят люди, которых ты и не думал ни о чем спрашивать". Желательно, отвечать
по сути:есть или нет курсоры. А решение я уже нашел. Можно сказать так, написал его в ручную.
← →
Digitman (2002-06-13 17:36) [17]По сути тебе уже ответили : нет никаких курсоров в ISQL-скрипте IB6.x. Все остальное - бестолковый треп.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c