powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / TEMPORARY TABLE
25 сообщений из 32, страница 1 из 2
TEMPORARY TABLE
    #33169664
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите почему не компелится следующая процедура?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE PROC1 (  )

LANGUAGE SQL

P1: BEGIN

DECLARE GLOBAL TEMPORARY TABLE SESSION.tmp(id INTEGER GENERATED BY DEFAULT AS IDENTITY, field INTEGER)
    WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

DECLARE temp_cursor CURSOR WITH HOLD WITH RETURN TO CLIENT
         FOR SELECT * FROM SESSION.tmp

OPEN temp_cursor;

END P1                
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33169675
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в своё время детали обсасывались в
http://groups.google.com/groups?hl=ru&lr=&group=comp.databases.ibm-db2
и в ibm-овской ньюсгруппе.

Я не запомнил, ибо мне не надо.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33169769
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE PROCEDURE PROC1 (  )
LANGUAGE SQL
P1: BEGIN

DECLARE GLOBAL TEMPORARY TABLE SESSION.tmp(id INTEGER GENERATED BY DEFAULT AS IDENTITY, field INTEGER)
    WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

 BEGIN
  DECLARE temp_cursor CURSOR WITH HOLD WITH RETURN TO CLIENT
           FOR SELECT * FROM SESSION.tmp;

  OPEN temp_cursor;
 END;

END P1|
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170037
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему вам не хватает запросов с WITH и табличных SQL-функций?
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170087
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо Astron
Victor MetelitsaПочему вам не хватает запросов с WITH и табличных SQL-функций?
Просто нужно сделать такую вещь:
процедура 1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE PROCEDURE PROC1 (  )

LANGUAGE SQL

P1: BEGIN

DECLARE GLOBAL TEMPORARY TABLE SESSION.tmp(id INTEGER GENERATED BY DEFAULT AS IDENTITY, field INTEGER)
    WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;


BEGIN
-- обьявить курсор для временной таблицы
DECLARE temp_cursor CURSOR WITH HOLD WITH RETURN TO CLIENT
         FOR SELECT * FROM SESSION.tmp;
--OPEN temp_cursor;
--открыть его нужно во второй процедуре
END;

END P1 

процедура 2

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE PROC2 (  )

LANGUAGE SQL

P1: BEGIN

DECLARE GLOBAL TEMPORARY TABLE SESSION.tmp(id INTEGER GENERATED BY DEFAULT AS IDENTITY, field INTEGER)
    WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

INSERT INTO SESSION.tmp SELECT *
--INSERT/UPDATE и т.д
                              FROM table1
                              ORDER BY i;
-- и вернуть первый курсор клиенту
END P1 
как это сделать? зарание огромное спасибо!
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170102
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему вам это надо сделать?
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170103
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, вам платят построчно.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170108
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor MetelitsaНаверное, вам платят построчно.
ну если вы видите другой вариант то подскажите плз.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170297
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Попробуй так:

Код: 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.
CREATE PROCEDURE PROC1()
   DYNAMIC RESULT SETS  1 
   LANGUAGE SQL
   BEGIN
      DECLARE GLOBAL TEMPORARY TABLE t (i INTEGER);

      BEGIN
         DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR
            SELECT * FROM session.t;

         CALL PROC2();
         OPEN c1;
      END;
   END@

CREATE PROCEDURE PROC2()
   LANGUAGE SQL
   BEGIN
      IF  1  =  0  THEN
          DECLARE GLOBAL TEMPORARY TABLE t (i INTEGER);
      END IF;

      INSERT SESSION.t (i) SELECT  111 ;
      COMMIT;
   END@


Мне лично интересно, как в PROC2 узнать, создана ли уже временная таблица, если нет, то создать. Т.е. типа (MS SQL):

IF object_id('tempdb..t') IS NULL THEN
DECLARE GLOBAL TEMPORARY TABLE t (i INTEGER);
END IF;

Если кто знает - подскажите, плз.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170302
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Проверил, вот так работает:
Код: 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.
CREATE PROCEDURE PROC1 (  )
LANGUAGE SQL
P1: BEGIN
        DECLARE GLOBAL TEMPORARY TABLE SESSION.t(i INTEGER)
        WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

        BEGIN
         DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR
            SELECT * FROM session.t;

         CALL PROC2();
         OPEN c1;
      END;

END P1

CREATE PROCEDURE PROC2()
   LANGUAGE SQL
   BEGIN
      IF  1  =  0  THEN
          DECLARE GLOBAL TEMPORARY TABLE t (i INTEGER);
      END IF;

      INSERT INTO SESSION.t (i) SELECT  111  FROM (VALUES  1 ) temp_table;
      COMMIT;
END
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170329
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
divp Victor MetelitsaНаверное, вам платят построчно.
ну если вы видите другой вариант то подскажите плз.

???

SELECT * FROM table1 ORDER BY i
(возможно, вместе с ROWNUMBER())

SP, да еще с temporary table - это мазохизм какой-то.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170338
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa divp Victor MetelitsaНаверное, вам платят построчно.
ну если вы видите другой вариант то подскажите плз.

???

SELECT * FROM table1 ORDER BY i
(возможно, вместе с ROWNUMBER())

SP, да еще с temporary table - это мазохизм какой-то.
хм а почему?
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170360
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, понял - вы надо мной насмехаетесь.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170367
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor MetelitsaАга, понял - вы надо мной насмехаетесь.
Почему? Возможно, целью стоит засадить сервер в idle на веки вечные, и выбить под это денег на новое железо, как знать? Я бы посоветовал NOT LOGGED заменить на просто LOGGED, для начала. Есть еще много способов, но самый лучший - устроить бардак с локировками, к сожалению к примеру не подходит :-(
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170391
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor MetelitsaАга, понял - вы надо мной насмехаетесь.
Как Вы могли такое подумать? После стольих ваших правильных советов у меня просто язык не повернется :) Вопрос конечно прояснил ak@ но хотелось бы узнать как можно проверить создана ли временная таблица или нет... как долго и в каких рамках ограничена "жизнь" временных таблиц?
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170437
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я спрашивал - зачем вы делаете то, что делаете? Зачем вам вообще нужны хранимые процедуры? Зачем нужны временные таблицы? Почему нельзя просто сделать выборку (SELECT, WITH, табличная функция), а нужно изощряться - куда-то что-то пихать, курсоры туда-сюда передавать?
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170521
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
я склонен согласится с Виктором...
Задача выглядит только как спортивный интерес, а не как реальная задача.
Хотя, в презенташке SP Profiling я встречал похожий синтаксис с пояснениями.
Ну там то понятно - учат.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33170732
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пока что знаю только один способ посмотреть структуру временной таблицы:
describe select * from session.<table>
Дело в том, что о временной таблице не существует никаких данных в системном каталоге. (В сущности правильно - нафига шоркать по каталогу?)
Хотя - из всего можно выкрутиться... При желании конечно.
1) Создать временную таблицу, в которой будет описание других времменных таблиц (ну хотябы перечень).
2) Юзать таблички с опцией REPLACE - чтоб было без разницы - создал ее или не создал. Объявил - перезаписалась.
3) Наехать на IBM. Пусть покажет как работать с временными таблицами. Ведь сервак-то знает и структуру таблиц и их индексы. Ток как мне кажется у IBM еще руки не дошли до этого. А может они сомневаются - нужно ли это юзеру.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171231
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
М-да, запинать кого-то легко. Попробую объяснить, почему я лично использовал такой подход в MS SQL и вот сейчас пытаюсь искать аналогии.
В программировании есть такое понятие "рефакторинг". И одним из самых наиболее используемых методов рефакторинга является "выделение метода" (пардон за каламбур). И я являюсь противником дублирования кода. Поэтому и на стороне клиента и на стороне сервера приложений и в БД старательно его избегаю, проводя время от времени это самое выделение метода. И если на стороне клиента/сервера приложений методы в качестве параметров чаще всего имеют переменные простого типа либо инстансы класса, то в СУБД, которая по определению "заточена" под работу с набором объектов, т.е. строк, вполне логично передавать наборы данных через временные таблицы.
Перетаскивание же данных на сервер приложений и последующая их обработка там приводит к потере производительности. Простой пример - сводный отчет по абонентам связи: результат отчета есть небольшая матрица с суммами и средними значениями, а данных под этим отчетом кроется очччень большой объем.

To gardenman: спасибо за подсказку с использованием врем. таблицы, но это не очень есть хорошо, поскольку иерархия вызовов может быть разной. Поэтому и WITH REPLACE не подходит (затрет все на фиг). Вот если бы был еще хинт WITH NOREPLACE :) было бы то, что надо. До IBM достучаться пока не могу. До августа саппорт у них в отпуске. Как только объявятся - постараюсь прояснить.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171302
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
вот-вот - как раз у разработчиков MSSQL я встретил процедуру с обалденным количеством temporary table.
Поскольку мне это мигрировать надо будет, буду разбираться, но чать уже выкинута за ненадобностью. С остальными будем посмотреть (по мере появления понимания)
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171384
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ak@
А почему бы не поступить просто - пытаешься создать временную таблицу - и обработать исключение.
Кстать GTT по у молчанию как раз и есть WITH NO REPLACE
Код: plaintext
1.
2.
3.
4.
5.
6.
db2 => declare global temporary table t1 (id int ) on commit preserve rows
DB20000I  The SQL command completed successfully.
db2 => declare global temporary table t1 (id int ) on commit preserve rows
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0601N  The name of the object to be created is identical to the existing
name "SESSION.T1" of type "DECLARED TEMPORARY TABLE".  SQLSTATE= 42710 
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171402
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ak@М-да, запинать кого-то легко.

Я не запинывал, а просто спросил. Вдруг что-то интересное узнаю?

Попробую объяснить, почему я лично использовал такой подход в MS SQL и вот сейчас пытаюсь искать аналогии.

У меня тоже есть объяснение - или предположение, по крайней мере. Сводится оно к тому, что SQL и/или блокировочный механизм на MS SQL убог настолько, что разработчикам приходится действовать через ж. Но на DB2 нет необходимости пользоваться тем же подходом.

В программировании есть такое понятие "рефакторинг". И одним из самых наиболее используемых методов рефакторинга является "выделение метода" (пардон за каламбур). И я являюсь противником дублирования кода. Поэтому и на стороне клиента и на стороне сервера приложений и в БД старательно его избегаю, проводя время от времени это самое выделение метода. И если на стороне клиента/сервера приложений методы в качестве параметров чаще всего имеют переменные простого типа либо инстансы класса, то в СУБД, которая по определению "заточена" под работу с набором объектов, т.е. строк, вполне логично передавать наборы данных через временные таблицы.


Мне это напоминает Белых Айя из Wheel of Time (как я понял, автор книг, Джордан, считает, что если несколько раз повторить "логично", то всё рассуждение будет логично). Что логично? В чем логично? Почему логично? Для чего result set необходимо получать именно из SP, а не из "честного SELECT'а"? Зачем данные нужно запихивать в temporary table?

Рефакторинг - разложение на множители. По отношению к SQL это будет разбиение запросы на подзапросы.

Типа из единичного
CREATE VIEW VY AS SELECT ...

сделать два:

CREATE VIEW VX AS SELECT ...
CREATE VIEW VY AS SELECT ... FROM Y ....
с возможным использованием VX в другом месте -
вот предполагаемый результат рефакторинга.

Если же вы эти подзапросы (в DB2) оформляете как SP, вы крайне затрудняете себе же жизнь. Вы не можете сделать

CREATE PROCEDURE PX ... (открыл курсор CX)
CREATE PROCEDURE PY ... SELECT ... FROM PX ... (открыл курсор CY)

У вас будет в несколько раз больше писанины (тогда как рефакторинг призван уменьшить её), работа с циклами вместо работы с множествами, лишний I/O (на вставку во временную таблицу), отсутствие части оптимизаций (при компиляции SELECT ... FROM VY в выражение будет подставлен текст VY с заинлайненым VX с последующей оптимизацией целиком, тогда как хранимая процедура в хранимую процедуру подставлена не будет).


Перетаскивание же данных на сервер приложений и последующая их обработка там приводит к потере производительности.

Это не обязательно так, но я веду не к тому. WITH и табличные SQL-функции дают возможность создавать _очень сложные_ запросы.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171408
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS.
Объектная СУБД у нас одна - GemStone/S (http://www.gemstone.com). Нехорошо обзывать байтовые огрызки объектами ;-)
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171510
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Когда я говорил "объекты" я имел ввиду, что очень часто "байтовый огрызок", представляющий собой данные одной строки мапится на объект в сервере приложений.
Данные проще получать из SP, а не из честного селекта, когда эта вызываемая SP содержит функционал, который может быть использован в другой процедуре. Вот оно, то самое уменьшение кода. Поэтому дублирование "честных селектов" и есть кривизна. Использование вьюшек - случай частный и примитивный, подходящий только к выборке данных.
Возвращаясь к отчетности. Да, блокировки, в особенности RR - это клево, но когда необходимо сделать отчет, который требует времени, проще сделать snapshot данных и обработать его, нежели париться потом с deadlock'ами.
И вообще, если СУБД не предоставляет возможности что-то сделать, почему надо это называть извращением?
Из объектных знаком только с Cache. Но опять же, речь не о ней.

Похоже пора закрывать топик. Пошел уже треп.
...
Рейтинг: 0 / 0
TEMPORARY TABLE
    #33171580
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не, не треп. Просто подходы и взгляд на разработку приложений у нас разный. По мне так если что-то можно вытянуть одним селектом - то уж лучше одним слектом, чем писать ХП. Если ХП используется в нескольких местах, и нужно в ней что-то подправить, значит изменения нужно учесть везде. Вот и получается что ХП где почти один и тот же код - целая куча. На ином серваке MSSQL этих ХП уже столько, что замучаешься их классифицировать. Короче говоря то, что применение ХП уменьшает количество кода - неправда. Или по крайней мере - не совсем правда.

Вообще, как на ваш взгляд, как легче поддерживать приложение, когда весь код в одном месте, или когда код поделен попалам - половина на сервере в ХП (где куча своих завязок) а половина в исходниках на с++ или еще каком языке?

Работа с ХП на MSSQL выгодна прежде всего производительностью. потому, что все что нужно уже откомпилировано. Конечно кому-то это облегчает задачу с той стороны, что не надо всякий раз перекомпилировать приложение, а достаточно поменять код на сервере. Да вот, только не всегда это получается безболезненно.

вот мне, например, очень жаль когда разработчики для DB2 отказывается от вложенного SQL. такой огроменный кусок вкусностей от IBM просто выкидывают.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / TEMPORARY TABLE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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