Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 возврат результатов из ХП  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
Всем, привет!

пытаюсь понять логику работы хранимых процедур...
создал тестовую процедуру для создания записи в таблице персонала,
которая возвращает ИД сотрудника
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]
27 апр 09, 09:25    [7116116]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
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),
OUT person_id integer )
...
27 апр 09, 10:07    [7116336]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
спасибо, Марк!

такой вариант у меня тоже был... :)
call partner_set(1,'1','1','1','1',3,'01/01/2009',?)
выполняется, но ничего не возвращает...
кроме того полагаю, что кроме сохранения процедуры нужно было и размещать её...
27 апр 09, 10:28    [7116452]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
однако походил по постам форума с поиском по call
никак не могу получить эффект, чтобы увидеть возвращаемый процедурой результат
в моем варианте получаю что-то типа execute procedure а не select from procedure
уж извините для ИБ-терминологию... :)
27 апр 09, 15:43    [7118923]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
jack_nsk,

Из процедуры можно возвратить 1 или несколько result set'ов и/или выходных параметров.
Что вам нужно?
Если не сложно, покажите схематично хотя бы...
27 апр 09, 16:01    [7119060]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
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.
27 апр 09, 16:06    [7119090]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
cпасибо, Семен!
насколько я понял, и
IDENTITY_VAL_LOCAL()
и
SELECT id FROM FINAL TABLE
извлекают текущий указатель столбца идентификации.
буду определяться в дальнейшем.

to Mark
перевел лотусовую базу на режим хранения в дб2,
на основные формы создал DBAccessView и
пытаюсь привести информацию в нормализованных вид для "оцифровывания" и последующих обработок.
в одной таблице есть поля о родителе и его детях (имена, даты рождения и т.д.)
т.к. количество детей может быть переменным, то естественным является решение о переносе данных о конкретном индивиде в отдельную таблицу с указанием в отдельном поле ссылки на родителя. С учетом того, что информация в исходной таблице слабо типизирована, а если точнее сказать, то является текстовой переменной с различными вариантами написания, то для её "причесывания" необходим достаточно большой кусок кода, который для улучшения читабельности и улучшения управления кодом желательно запаковать в хранимую процедуру.
С учетом того, что при создании записи персоны нужно указывать код родителя, этот код должна возвращать или SQL-процедура или SQL-функция в пределах одной транзакции, которая обрабатывает одну исходную запись в DBAccessView
27 апр 09, 18:15    [7120076]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
Я про это спрашивал:
jack_nsk
однако походил по постам форума с поиском по call
никак не могу получить эффект, чтобы увидеть возвращаемый процедурой результат
Какой результат вам нужен? В виде result set или в виде выходного параметра?
В какой клиентской программе вы не можете увидеть результат?
28 апр 09, 10:44    [7121783]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
если с практической точки зрения, то возврат в переменную внутри хранимой процедуры
если с образовательно-познавательной, то увидеть любые результаты, которые возвращает
IBM Data Studio Developer - изнемогаю от любопытства... :)
пока вижу, что процедура работает, но на выход ничего не выдает...
конечно это может быть в настройках IBM Data Studio Developer,
но он для меня тоже новый инструмент...
28 апр 09, 11:04    [7121928]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
jack_nsk
если с практической точки зрения, то возврат в переменную внутри хранимой процедуры
если с образовательно-познавательной, то увидеть любые результаты, которые возвращает
IBM Data Studio Developer - изнемогаю от любопытства... :)
пока вижу, что процедура работает, но на выход ничего не выдает...
конечно это может быть в настройках IBM Data Studio Developer,
но он для меня тоже новый инструмент...
Вот вам пример.
Добейтесь, чтоб было так:
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
28 апр 09, 11:24    [7122078]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
Марк, спасибо!
особенно за терпение... :)

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

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

получается, что выходные параметры в хранимой процедуре это что-то типа рудимента ?
29 апр 09, 18:43    [7131020]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
jack_nsk
насколько я понял, для тех случаев, когда из процедуры нужно вернуть данные,
то основным инструментом для этого предназначен курсор.
...
получается, что выходные параметры в хранимой процедуре это что-то типа рудимента ?
Нет.
Каждый способ возврата данных предназначен для своих целей.
Если мне надо вернуть из процедуры 1 или несколько значений, я не буду использовать курсоры.
30 апр 09, 09:56    [7132601]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: возврат результатов из ХП  [new]
mrCyber
Member

Откуда:
Сообщений: 15
Mark Barinstein
Нет. Каждый способ возврата данных предназначен для своих целей.

Марк, не могли бы вы перечислить (или дать ссылку на источник, где есть ответ) способы возврата данных из ХП в случае, если внутри ХП отрабатывает select и мне нужен результирующий набор строк.

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

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

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

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

Спасибо!
29 сен 10, 23:23    [9526436]     Ответить | Цитировать Сообщить модератору
 Re: возврат результатов из ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
mrCyber,

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

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

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;
30 сен 10, 11:02    [9527901]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить