powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Хранимая п. DB2
23 сообщений из 23, страница 1 из 1
Хранимая п. DB2
    #33795734
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу разобраться с языком DB2.
Ниже привожу текст хранимой процедуры InterBase
Пожалуйста изобразите как она будет выглядеть в DB2.


CREATE PROCEDURE BA_TST
RETURNS (
P1 VARCHAR(3),
P3 VARCHAR(15))
AS
DECLARE VARIABLE P2 BIGINT;
begin
for select grafik.raion,grafik.id_regnum from grafik
where grafik.raion='003'
into :p1, :p2
do
begin
select masterregnum.regnum from masterregnum
where masterregnum.id_regnum=:p2
into : p3;
suspend;
end
end
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33795836
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE BA_TST ()
language sql
dynamic result sets 1
begin
  declare c1 cursor with return for 
    select g.raion, m.regnum
    from grafik g
    join masterregnum m on g.id_regnum=m.id_regnum
    where g.raion='003';
  open c1;
end@
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33795914
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да так я и сам смогу написать !!!!!!!!!!!!!!!!!!
Мне нужен пример как сохранить каждую строку первого селекта
в переменные, а потом эти переменные использовать во втором селекте !
Вот в чём смысл вопроса !
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33795960
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for g as
  select raion, id_regnum 
  from grafik 
  where raion='003'
do
  select regnum into p3
  from masterregnum
  where id_regnum=g.id_regnum;
end for;
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33801493
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не работает у меня этот код !
У меня версия 8.1
Опять же вопрос по коду:
во втором селекте результат запоминается в переменную
(или в параметр) А как результат первого селекта и параметр
вернуть на клиент единым набором данных ?
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33801804
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват.
Должно быть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for g as
  select raion, id_regnum 
  from grafik 
  where raion='003'
do
  set p3=
  (
  select regnum
  from masterregnum
  where id_regnum=g.id_regnum
  );
end for;
Как возвращать набор данных, смотрите выше.
Выходные параметры объявляются примерно так:
Код: plaintext
CREATE PROCEDURE BA_TST(OUT P3 VARCHAR( 15 ))
В теле процедуры делаете этому параметру SET.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802092
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
power-baaНе могу разобраться с языком DB2.
Ниже привожу текст хранимой процедуры InterBase
Пожалуйста изобразите как она будет выглядеть в DB2.



Эти два запроса можно и нужно переписать как один (оформив, если нужно, как view). Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
select grafik.raion, masterregnum.regnum
from grafik 
  join masterregnum 
  on grafik.id_regnum =  masterregnum.id_regnum
where grafik.raion='003'

Так, как вы написали, она всё равно выглядеть не будет. И слава богу.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802140
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
...
Как возвращать набор данных, смотрите выше.
Выходные параметры объявляются примерно так:
...
Марк, вам стоило бы познакомиться с Interbase. Приведённый в первом письме код в DB2 соответствует не хранимой процедуре, а UDF. Вызывается как

select p1, p3 from BA_TST.

Внутри неявный цикл, где p1 и p3 присваиваются значения, а потом при выполнении suspend эти значения p1 и p3 "выталкиваются" в поток и "потребляются" select'ом.

Похоже устроены не-SQL табличные UDF (Java, C), но на SQL UDF это не эмулируется. Бедные граждане, которые воображают, будто знают SQL и умеют им пользоваться, но мышление которых на деле осталось Клипперным, ужасно страдают ;-)
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802440
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinВиноват.
Должно быть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for g as
  select raion, id_regnum 
  from grafik 
  where raion='003'
do
  set p3=
  (
  select regnum
  from masterregnum
  where id_regnum=g.id_regnum
  );
end for;
Как возвращать набор данных, смотрите выше.
Выходные параметры объявляются примерно так:
Код: plaintext
CREATE PROCEDURE BA_TST(OUT P3 VARCHAR( 15 ))
В теле процедуры делаете этому параметру SET.

И все строки набора передадуться ? Или надо делать fetch после каждой строки ?
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802536
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
power-baaИ все строки набора передадуться ? Или надо делать fetch после каждой строки ?
В последнем примере я привел два не связанных между собой примера.
Первый - как работает цикл FOR в DB2.
Второй - как работать с выходным параметром.
Вы не вернете набор данных с помощью цикла FOR в DB2, как вы делали это в Interbase.
Как это делать - смотрите самый первый мой ответ.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802743
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein power-baaИ все строки набора передадуться ? Или надо делать fetch после каждой строки ?
В последнем примере я привел два не связанных между собой примера.
Первый - как работает цикл FOR в DB2.
Второй - как работать с выходным параметром.
Вы не вернете набор данных с помощью цикла FOR в DB2, как вы делали это в Interbase.
Как это делать - смотрите самый первый мой ответ.

В самом первом ответе вообще нет выходных параметров.
Такую задачу я уже реализовывал.
А тут набор возвращается через выходные параметры.
Его тоже с помощью курсора возвращать ? не понимаю.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802844
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
power-baaА тут набор возвращается через выходные параметры.
Его тоже с помощью курсора возвращать ? не понимаю.
Наборы данных не возвращаются в DB2 через параметры.
Давайте с самого начала:
что вам сделать-то надо, т.е. что вы хотите вернуть из процедуры?
какие параметры приходят в процедуру (если есть)?
Имейте ввиду, что вы не можете использовать процедуру в select команде, как в interbase.
Процедура может вызываться только через команду CALL, а потом то, что ее вызвало может получить и обработать набор(ы) данных и выходные параметры, если все это возвращает процедура.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33802980
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот есть у меня такая процедура, которая отлично работает.
Возвращает в явовский клиент набор строк. И вызывается эта процедура
естественно через СALL


CREATE PROCEDURE PD190439.BA_DEATH_PEN ( IN i_n_date DATE,
IN i_k_date DATE
)
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------

------------------------------------------------------------------------
P1: BEGIN


-- Объявить указатель
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT DEATH.FAMILY , DEATH.NAME_L , DEATH.FATHER , DEATH.D_ROGD , DEATH.D_SMER , DEATH.ADRES , DEATH.L_SCHET
FROM DEATH AS DEATH
WHERE DEATH.D_SMER >= BA_DEATH_PEN.i_n_date AND DEATH.D_SMER <= BA_DEATH_PEN.i_k_date;

-- Указатель оставлен открытым для программы клиента
OPEN cursor1;


END P1

но не все процедуры так просты ! Не везде обойдёшься одним селектом,
собрав туда все таблицы. Иногда приходится делать несколько селектов.
В частности для повышения скорости. Как тогда результаты разных запросов свести в один набор данных и передать на клиента ? Тут, как я понял,
нужно применять выходные параметры. Так ? Как же тогда вернуть все строки набора ? Через fetch ? Пробовал ставить - ругается !
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803003
й
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возвращать больее одного набора данных
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803005
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
Давайте с самого начала:
что вам сделать-то надо, т.е. что вы хотите вернуть из процедуры?

По-моему, с самого начала видно, что он хочет не процедуру, а табличную UDF, причём реализованную в стиле "хранимая процедура Interbase" (т.е. так, как в DB2 на SQL PL сделать просто невозможно, но и не нужно).
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803020
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
power-baa
но не все процедуры так просты ! Не везде обойдёшься одним селектом,
собрав туда все таблицы. Иногда приходится делать несколько селектов.
В частности для повышения скорости. Как тогда результаты разных запросов свести в один набор данных и передать на клиента ?

Вот как (по первому письму этого не видно)? А чем же плох банальный UNION ALL?
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803070
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa power-baa
но не все процедуры так просты ! Не везде обойдёшься одним селектом,
собрав туда все таблицы. Иногда приходится делать несколько селектов.
В частности для повышения скорости. Как тогда результаты разных запросов свести в один набор данных и передать на клиента ?

Вот как (по первому письму этого не видно)? А чем же плох банальный UNION ALL?

Тем, что поля с разных запросов должны возвращаться в одной строке
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803086
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
power-baa Victor Metelitsa power-baa
но не все процедуры так просты ! Не везде обойдёшься одним селектом,
собрав туда все таблицы. Иногда приходится делать несколько селектов.
В частности для повышения скорости. Как тогда результаты разных запросов свести в один набор данных и передать на клиента ?

Вот как (по первому письму этого не видно)? А чем же плох банальный UNION ALL?

Тем, что поля с разных запросов должны возвращаться в одной строке

Как :p1 и :p3 в примере наверху? Это вы таким путём скорость повышаете?
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803118
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Victor Metelitsa
Как :p1 и :p3 в примере наверху? Это вы таким путём скорость повышаете?[/quot]

Наверху приведён примитивный пример, чтобы было понятно что я хочу.
Когда for select в InterBase идет по куче больших таблиц, могут возникнуть сильные тормоза. Получение нескольких полей при этом селектами внутри
цикла for select повышает скорость в разы и более. Проверено.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803119
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
power-baaно не все процедуры так просты ! Не везде обойдёшься одним селектом,
собрав туда все таблицы. Иногда приходится делать несколько селектов.
В частности для повышения скорости. Как тогда результаты разных запросов свести в один набор данных и передать на клиента? Тут, как я понял,
нужно применять выходные параметры. Так?
Нет, не так.
Тут уже две проблемы, я вижу:
1. передать более одного набора клиенту
2. реализовать сложную, или медленно работающую одним селектом логику.

Для (1) уже советовали: возвращайте несколько наборов или объединяйте наборы (если они не слишком разнородны) оператором UNION ALL.
Для (2) к вашим услугам global temporary tables для хранения промежуточных наборов данных (в сложных случаях именно их я и использую).
Насобирав в них данные вы можете выдать наружу select на их основе, например.
Всякие циклы я бы не советовал использовать без веских на то причин, т.к. решение на их основе очень часто (хотя и не всегда) медленне "групповой" обработки.
Я их использую, только если по-другому - никак, например, надо вызвать SP для каждого значения поля, возвращаемого селектом...
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33803308
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
power-baa Victor Metelitsa
Как :p1 и :p3 в примере наверху? Это вы таким путём скорость повышаете?

Наверху приведён примитивный пример, чтобы было понятно что я хочу.
Когда for select в InterBase идет по куче больших таблиц, могут возникнуть сильные тормоза. Получение нескольких полей при этом селектами внутри
цикла for select повышает скорость в разы и более. Проверено.

Мне такое совершенно не приходило в голову - эмулировать join "вручную". Потому что, на мой вгляд, такой приём должен не только не ускорить, а даже затормозить, и тем сильнее, чем больше строк во внешнем цикле. В Interbase, наверное, с оптимизатором уж очень плохо.
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33804283
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein power-baaно не все процедуры так просты ! Не везде обойдёшься одним селектом,
собрав туда все таблицы. Иногда приходится делать несколько селектов.
В частности для повышения скорости. Как тогда результаты разных запросов свести в один набор данных и передать на клиента? Тут, как я понял,
нужно применять выходные параметры. Так?
Нет, не так.
Тут уже две проблемы, я вижу:
1. передать более одного набора клиенту
2. реализовать сложную, или медленно работающую одним селектом логику.

Для (1) уже советовали: возвращайте несколько наборов или объединяйте наборы (если они не слишком разнородны) оператором UNION ALL.
Для (2) к вашим услугам global temporary tables для хранения промежуточных наборов данных (в сложных случаях именно их я и использую).
Насобирав в них данные вы можете выдать наружу select на их основе, например.
Всякие циклы я бы не советовал использовать без веских на то причин, т.к. решение на их основе очень часто (хотя и не всегда) медленне "групповой" обработки.
Я их использую, только если по-другому - никак, например, надо вызвать SP для каждого значения поля, возвращаемого селектом...

А можно примерчик с использованием global temporary tables ?
...
Рейтинг: 0 / 0
Хранимая п. DB2
    #33804394
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
power-baaА можно примерчик с использованием global temporary tables ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
>>-DECLARE GLOBAL TEMPORARY TABLE--table-name------------------->

        .-,---------------------.
        V                       |
>--+-(----| column-definition |-+--)-----------------------------+-->
   +-LIKE--+-table-name1-+--+------------------+-----------------+
   |       '-view-name---'  '-| copy-options |-'                 |
   '-AS--(--fullselect--)--DEFINITION ONLY--+------------------+-'
                                            '-| copy-options |-'

      .-ON COMMIT DELETE ROWS---.
>--*--+-------------------------+--*---------------------------->
      '-ON COMMIT PRESERVE ROWS-'

>--+-------------------------------------------+---------------->
   |             .-ON ROLLBACK DELETE ROWS---. |
   '-NOT LOGGED--+---------------------------+-'
                 '-ON ROLLBACK PRESERVE ROWS---'

>--*--+--------------+--*--+---------------------+-------------->
      '-WITH REPLACE-'     '-IN--tablespace-name-'

column-definition:

|--column-name--| data-type |--+--------------------+-----------|
                               '-| column-options |-'

column-options:

|--*--+----------+--*--+----------------------------------------------------------------------+--*--|
      '-NOT NULL-'     +-| default-clause |---------------------------------------------------+
                       '-GENERATED--+-ALWAYS-----+--AS--IDENTITY--+-------------------------+-'
                                    '-BY DEFAULT-'                '-| identity-attributes |-'

copy-options:

                                                                        .-COLUMN ATTRIBUTES-.
                                                  .-EXCLUDING IDENTITY--+-------------------+-.
|--*--+-------------------------------------+--*--+-------------------------------------------+--*--|
      |                .-COLUMN-.           |     |                     .-COLUMN ATTRIBUTES-. |
      '-+-INCLUDING-+--+--------+--DEFAULTS-'     '-INCLUDING IDENTITY--+-------------------+-'
        '-EXCLUDING-'
Перед началом использования таких таблиц надо убедиться, что в базе создан
user temporary tablespace (см. create tablespace команду).
А вообще, если у вас есть постоянный доступ в интернет, запишите ссылочку:
http://publib.boulder.ibm.com/infocenter/db2luw/v8//index.jsp
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Хранимая п. DB2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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