powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
5 сообщений из 5, страница 1 из 1
Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
    #32253700
Okram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел написать рекурсивную процедурку
но не тут то было.
Проблема состоит в том что в процедуре отривается
курсор, из которого я фетчу в цикле результаты
и запихиваю их как параметри к той же процедуре.
И есть следующий ерор :
The cursor specified in an OPEN statement is already open.

а можно что-бы курсор создавался локально только для
процедури а не для всех?

Спасибо всем

код проседуры



CREATE PROCEDURE DeleteOP
(
IN pIdO BIGINT,
IN pIdP BIGINT
)
LANGUAGE SQL
BEGIN

DECLARE exist_idProperty BIGINT;
DECLARE exist_subproperty CURSOR FOR
SELECT idP
FROM OPViews
WHERE idO=pIdO AND
ParentProperty=pIdP;

DELETE FROM cOP
WHERE idO = pIdO AND
idP = pIdP;

OPEN exist_subproperty;

SET exist_idProperty=0;

WHILE NOT exist_idProperty IS NULL DO
SET exist_idProperty=NULL;
FETCH exist_subproperty INTO exist_idProperty;
IF NOT exist_idProperty IS NULL THEN
CALL SaveObjectProperties ( pIdO , exist_idProperty);
END WHILE;

CLOSE exist_subproperty;
...
Рейтинг: 0 / 0
Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
    #32254930
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В процедурных курсорах я ничего не понимаю (и не хочу понимать), но суть, дела, как я понимаю, такова. Надо удалить из cOP некоторый набор записей. Замечу, что в DB2 вместо

Код: plaintext
1.
2.
DELETE FROM cOP 
WHERE idO = pIdO AND idP = pIdP;

можно более наглядно писать
Код: plaintext
1.
2.
DELETE FROM cOP 
WHERE (idO,idP) = (pIdO,pIdP);


Нам же нужно удалить набор записей - это можно оформить как

Код: plaintext
1.
2.
DELETE FROM cOP 
WHERE (idO,idP) IN (SELECT pIdO,pIdP FROM НекотороеViewИлиUDF);


а вот это НекотороеViewИлиUDF делаем рекурсивным. Навскидку для меня тело выглядит примерно как

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH
  temp(xpIdO,xpIdP) as (
    values(:pIdO,:pIdP)
    union all
    select :pIdO,idP
    from temp, OPViews 
    WHERE OPViews.idO=temp.xpIdO AND OPViewsParentProperty=temp.pIdP
      and OPViews.idP IS NOT NULL
  )
select xpIdO as pIdO, xpIdP aspIdP
from temp

здесь могут быть ошибки, но общая идея должна быть понятна.
...
Рейтинг: 0 / 0
Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
    #32255005
Okram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО БОЛЬШОЕ
...
Рейтинг: 0 / 0
Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
    #32255314
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В v 7.2 есть ограничение на вложенные вызовы процедур = 16. Вопрос к тем, кто юзает v 8 - ограничение осталось?
...
Рейтинг: 0 / 0
Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
    #32255557
IBMer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да осталось.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Рекурсивные СТОРЕД ПРОЦЕДУРы С КУРСОРАМИ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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