Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / возврат результатов из ХП / 14 сообщений из 14, страница 1 из 1
27.04.2009, 09:25
    #35955140
jack_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
Всем, привет!

пытаюсь понять логику работы хранимых процедур...
создал тестовую процедуру для создания записи в таблице персонала,
которая возвращает ИД сотрудника
CREATE PROCEDURE PARTNER_SET ( IN id integer,
IN first_name VARCHAR(40),
IN middle_name VARCHAR(40),
IN last_name VARCHAR(40),
IN sex VARCHAR(20),
IN parentid integer,
IN birth VARCHAR(20),
person_id integer )
LANGUAGE SQL
P1: BEGIN
-- Объявить переменную
DECLARE PERSON_TMP INTEGER DEFAULT 0;

SELECT id into PERSON_TMP FROM FINAL TABLE
(INSERT INTO PERSONS (FIRST_NAME, MIDDLE_NAME, LAST_NAME, SEX,
PARENTID, BIRTH)
VALUES (PARTNER_SET.first_name, PARTNER_SET.middle_name, PARTNER_SET.last_name, 1,
PARTNER_SET.parentid,
PARTNER_SET.birth));
SET person_id = PERSON_TMP;
END P1

потом пытаюсь получить результаты работы процедуры
call partner_set(1,'1','1','1','1',3,'01/01/2009',?)

"не выходит каменный цветок"... :)
IBM Data Studio Developer
Версия 2.1
открывает окно для ввода значения для переменной "?"
как будто это входная переменная...

в чем я "согрешил" ?

и что также немаловажно...
а не лучше ли для случаев, когда возвращается только одно значение использовать
SQL-function а не SQL-procedure[src][/SRC]
...
Рейтинг: 0 / 0
27.04.2009, 10:07
    #35955225
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
jack_nskCREATE PROCEDURE PARTNER_SET ( IN id integer,
IN first_name VARCHAR(40),
IN middle_name VARCHAR(40),
IN last_name VARCHAR(40),
IN sex VARCHAR(20),
IN parentid integer,
IN birth VARCHAR(20),
OUT person_id integer )
...
...
Рейтинг: 0 / 0
27.04.2009, 10:28
    #35955287
jack_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
спасибо, Марк!

такой вариант у меня тоже был... :)
call partner_set(1,'1','1','1','1',3,'01/01/2009',?)
выполняется, но ничего не возвращает...
кроме того полагаю, что кроме сохранения процедуры нужно было и размещать её...
...
Рейтинг: 0 / 0
27.04.2009, 15:43
    #35956355
jack_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
однако походил по постам форума с поиском по call
никак не могу получить эффект, чтобы увидеть возвращаемый процедурой результат
в моем варианте получаю что-то типа execute procedure а не select from procedure
уж извините для ИБ-терминологию... :)
...
Рейтинг: 0 / 0
27.04.2009, 16:01
    #35956408
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
jack_nsk,

Из процедуры можно возвратить 1 или несколько result set'ов и/или выходных параметров.
Что вам нужно?
Если не сложно, покажите схематично хотя бы...
...
Рейтинг: 0 / 0
27.04.2009, 16:06
    #35956422
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE PROCEDURE PARTNER_SET ( IN id integer,
                               IN first_name VARCHAR( 40 ),
                               IN middle_name VARCHAR( 40 ),
                               IN last_name VARCHAR( 40 ),
                               IN sex VARCHAR( 20 ),
                               IN parentid integer,
                               IN birth VARCHAR( 20 ),
                               OUT person_id integer )
LANGUAGE SQL                               
P1: BEGIN
   INSERT INTO PERSONS (FIRST_NAME, MIDDLE_NAME, LAST_NAME, SEX, PARENTID, BIRTH)
   VALUES (first_name, middle_name, last_name,  1 , parentid, birth);
   SET person_id=IDENTITY_VAL_LOCAL();
END P1
, если поле ID в таблице PERSONS объявлено как generated as identity.
...
Рейтинг: 0 / 0
27.04.2009, 18:15
    #35956876
jack_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
cпасибо, Семен!
насколько я понял, и
IDENTITY_VAL_LOCAL()
и
SELECT id FROM FINAL TABLE
извлекают текущий указатель столбца идентификации.
буду определяться в дальнейшем.

to Mark
перевел лотусовую базу на режим хранения в дб2,
на основные формы создал DBAccessView и
пытаюсь привести информацию в нормализованных вид для "оцифровывания" и последующих обработок.
в одной таблице есть поля о родителе и его детях (имена, даты рождения и т.д.)
т.к. количество детей может быть переменным, то естественным является решение о переносе данных о конкретном индивиде в отдельную таблицу с указанием в отдельном поле ссылки на родителя. С учетом того, что информация в исходной таблице слабо типизирована, а если точнее сказать, то является текстовой переменной с различными вариантами написания, то для её "причесывания" необходим достаточно большой кусок кода, который для улучшения читабельности и улучшения управления кодом желательно запаковать в хранимую процедуру.
С учетом того, что при создании записи персоны нужно указывать код родителя, этот код должна возвращать или SQL-процедура или SQL-функция в пределах одной транзакции, которая обрабатывает одну исходную запись в DBAccessView
...
Рейтинг: 0 / 0
28.04.2009, 10:44
    #35957750
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
Я про это спрашивал:jack_nskоднако походил по постам форума с поиском по call
никак не могу получить эффект, чтобы увидеть возвращаемый процедурой результатКакой результат вам нужен? В виде result set или в виде выходного параметра?
В какой клиентской программе вы не можете увидеть результат?
...
Рейтинг: 0 / 0
28.04.2009, 11:04
    #35957830
jack_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
если с практической точки зрения, то возврат в переменную внутри хранимой процедуры
если с образовательно-познавательной, то увидеть любые результаты, которые возвращает
IBM Data Studio Developer - изнемогаю от любопытства... :)
пока вижу, что процедура работает, но на выход ничего не выдает...
конечно это может быть в настройках IBM Data Studio Developer,
но он для меня тоже новый инструмент...
...
Рейтинг: 0 / 0
28.04.2009, 11:24
    #35957887
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
jack_nskесли с практической точки зрения, то возврат в переменную внутри хранимой процедуры
если с образовательно-познавательной, то увидеть любые результаты, которые возвращает
IBM Data Studio Developer - изнемогаю от любопытства... :)
пока вижу, что процедура работает, но на выход ничего не выдает...
конечно это может быть в настройках IBM Data Studio Developer,
но он для меня тоже новый инструмент...Вот вам пример.
Добейтесь, чтоб было так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE PROCEDURE TEST_RES (IN PSCHEMA VARCHAR( 128 ), OUT PTABCOUNT INT)
DYNAMIC RESULT SETS  1 
BEGIN
    DECLARE cursor1 CURSOR WITH RETURN FOR
	SELECT TABNAME 
	FROM SYSCAT.TABLES
	WHERE TABSCHEMA=PSCHEMA;

    SELECT COUNT( 1 ) INTO PTABCOUNT
    FROM SYSCAT.TABLES
    WHERE TABSCHEMA=PSCHEMA;
    OPEN cursor1;
END
Сделайте ей deploy и потом run.
Обратите внимение, что если надо, чтоб процедура возвращала result set, то надо
- dynamic result set 1
- cursor with return
...
Рейтинг: 0 / 0
29.04.2009, 18:43
    #35961835
jack_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
Марк, спасибо!
особенно за терпение... :)

почитал ответы, полистал форум, заглянул на ИБМ и кажется понял,
как сформулировать свой вопрос... :)

насколько я понял, для тех случаев, когда из процедуры нужно вернуть данные,
то основным инструментом для этого предназначен курсор.
что он дает:
1. отпадает необходимость прописывать в процедуре выходные параметры,
т.к. список возвращаемых параметров формируется при декларировании
или prepare курсора
(это например по сравнению с ИБ)
2. на клиенте появляется возможность выбрать либо n-записей из курсора
или весь курсор

получается, что выходные параметры в хранимой процедуре это что-то типа рудимента ?
...
Рейтинг: 0 / 0
30.04.2009, 09:56
    #35962669
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
jack_nskнасколько я понял, для тех случаев, когда из процедуры нужно вернуть данные,
то основным инструментом для этого предназначен курсор.
...
получается, что выходные параметры в хранимой процедуре это что-то типа рудимента ?Нет.
Каждый способ возврата данных предназначен для своих целей.
Если мне надо вернуть из процедуры 1 или несколько значений, я не буду использовать курсоры.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
29.09.2010, 23:23
    #36873306
mrCyber
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
Mark BarinsteinНет. Каждый способ возврата данных предназначен для своих целей.
Марк, не могли бы вы перечислить (или дать ссылку на источник, где есть ответ) способы возврата данных из ХП в случае, если внутри ХП отрабатывает select и мне нужен результирующий набор строк.

Предыдущий проект был на Oracle, теперь приходится осваивать DB2 (9.5, 9.7, win32). Вижу массу сходств и не понимаю, почему их так много. В IBM решили реализовать основную часть оракловых фишек у себя, чтобы желающие могли легко перейти на DB2? Или как? Откуда столько пересечений?

В том же Оракле, на ск. я понимаю, практически единственный нормальный способ вернуть результат селекта в хранимке - это "ref cursor". Что предлагает на эту тему DB2? Все так же или вар-тов больше?

Про dynamic result set. Как схематически может выглядеть ХП, из которой я собираюсь вернуть более одного резалтСэта? Что нужно сделать, чтобы вернуть неск. резалтСэтов - открыть неск. курсоров, сделать неск. селектов?

Спецификаторы 'reads sql data', 'modifies sql data' и остальные, указываемые про создании ХП - они фактически влияют на что? Они нужны оптимизатору или еще где-то как-то выстреливают?

Спасибо!
...
Рейтинг: 0 / 0
30.09.2010, 11:02
    #36873832
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат результатов из ХП
mrCyber,

В вызываемой процедуре открываете столько курсоров (with return не забудьте в их декларации), как указано выше, сколько надо.

В вызывающей:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE l1, ..., ln RESULT_SET_LOCATOR VARYING;
...
call myproc(...);
 ASSOCIATE  LOCATOR (l1, ..., ln) WITH PROCEDURE myproc;

 ALLOCATE  c1 CURSOR FOR RESULT SET l1;
OPEN c1;
FETCH c1 INTO ...;
...
ALLOCATE cn CURSOR FOR RESULT SET ln;
OPEN cn;
FETCH cn INTO ...;
...
CLOSE c1;
...
CLOSE cn;
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / возврат результатов из ХП / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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