Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-23542
putim
2002-06-26 17:17
2002.07.08
вопрос


1-23546
Дельфятник
2002-06-26 17:37
2002.07.08
Access Violation при работе с TComboBox.


1-23556
strel
2002-06-18 19:04
2002.07.08
Неясная ошибка при попытке использовании EXCEL (OLE object)


7-23806
sniknik
2002-04-09 18:54
2002.07.08
Определение сетевого диска на доступность


3-23500
vads
2002-06-17 12:24
2002.07.08
Нахожусь на грани помешательства !!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский