Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание временной таблицы в хранимой функции / 5 сообщений из 5, страница 1 из 1
30.11.2006, 18:12
    #34168474
jaga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание временной таблицы в хранимой функции
Приветствую всех!
Пытаюсь в хранимой функции создавать временную таблицу, а потом ее использовать.
А мне в ответ ошибка - что этот релэйшн даз нот экзист.
Языки пытался использовать sql и plpgsql.
Что посоветуете?
...
Рейтинг: 0 / 0
30.11.2006, 20:53
    #34168840
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание временной таблицы в хранимой функции
Посоветуем использовать поиск по форуму. Проблемма обсуждалась не раз.

P.S. И использовать EXECUTE что бы планы запросов не кешировались.
...
Рейтинг: 0 / 0
01.12.2006, 09:02
    #34169271
jaga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание временной таблицы в хранимой функции
JelisПосоветуем использовать поиск по форуму. Проблемма обсуждалась не раз.

Согласен, что обсуждалась - но относительно MS SQL Server , и там конкретно сказали, что в хранимых процедурах временные таблицы использовать нельзя. Может и в PostgreSQL тоже нельзя?
Только где это явно в документации прописано? Я найти не смог.
...
Рейтинг: 0 / 0
01.12.2006, 10:30
    #34169466
Serik.Akhmetov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание временной таблицы в хранимой функции
(С) не моелучше один раз увидеть, чем сто раз услышать
Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
-- Function: audio_s(IN p_date1 "timestamp", IN p_date2 "timestamp", IN step int4, OUT channel_no int4, OUT column_no int4, OUT value int4)

-- DROP FUNCTION audio_s(IN p_date1 "timestamp", IN p_date2 "timestamp", IN step int4, OUT channel_no int4, OUT column_no int4, OUT value int4);

CREATE OR REPLACE FUNCTION audio_s(IN p_date1 "timestamp", IN p_date2 "timestamp", IN step int4, OUT channel_no int4, OUT column_no int4, OUT value int4) AS
$BODY$declare
  rec        record;
  --l_step     interval;
  l_step_sec int4;
  l_deth     int4;
  l_chl_c    int4;
  l_x1       int4;
  l_x2       int4;
  l_time_beg timestamp;
  l_time_end timestamp;
  i          int4;
  i2         int4;
  l_value    int4;
  l_length   int4;
  sql        text;
  l_col_1    int4;
  l_col_2    int4;
  l_pos      int4;
begin

    l_deth     :=  16 ; -- кол-во линий в ячейке
    l_chl_c    :=  32 ; -- кол-во каналов

    l_step_sec := step *  60 ;
    l_length   := interval_to_sec(p_date2 - p_date1);

-- временая таблица для промежуточного результата
sql := 'CREATE temporary TABLE res
(  
  t_channel    int4,
  t_column_no  int4,
  t_value      int4
) 
WITHOUT OIDS;
CREATE INDEX k_res ON res (t_channel, t_column_no);';
  execute sql;

-- инициализация временной таблицы
  for i IN  1  .. l_chl_c loop
    for i2 IN  1  .. (l_length/l_step_sec) loop
      sql := 'insert into res(t_channel, t_column_no, t_value)
      values (' || i || ',' || i2 || ',0);';
      execute sql;
    end loop;
  end loop;

    for rec in 
        select *
        from audio
        where (time_beg>p_date1 and time_beg<p_date2) 
           or (time_end>p_date1 and time_end<p_date2) 
           or (time_beg<p_date1 and time_end>p_date2)
        order by id_channel, time_beg
    loop
        l_time_beg   := rec.time_beg;

        column_no := (interval_to_sec(l_time_beg - p_date1))/l_step_sec +  1 ; 

        l_col_1   := l_step_sec * (column_no -  1 );
        l_col_2   := l_step_sec * column_no;
        l_pos     := interval_to_sec(l_time_beg - p_date1);

        l_x1      := (l_deth * (l_pos - l_col_1))/l_step_sec;

        l_time_end:= rec.time_end;

        if (rec.time_end is NULL or rec.time_end > (p_date1+sec_to_interval(l_step_sec*column_no))) then 
          l_time_end := p_date1+sec_to_interval(l_step_sec*column_no);
        end if;
        l_pos     := interval_to_sec(l_time_end - p_date1);
        l_x2      := (l_deth * (l_pos - l_col_1))/l_step_sec;

        l_value :=  0 ;

        for i IN  1  .. l_deth loop
          if ((i=l_x1 or i>l_x1) and (i=l_x2 or i<l_x2)) then
            l_value := l_value | ( 1  << (i- 1 ));
          end if;
        end loop;

-- запись результата по строке во временную таблицу
        if (l_value >  0 ) then
          sql := 'update res
                   set t_value = t_value | ' || l_value ||
                 ' where t_channel = ' || rec.id_channel || ' and t_column_no = ' || column_no || ';';
          execute sql;
        end if;

    end loop; -- for rec in

-- возврат результата
  sql := 'select * from res where t_value >0;';
  for rec in
    execute sql
  loop
    channel_no := rec.t_channel;
    column_no  := rec.t_column_no;
    value      := rec.t_value;
    return next;  
  end loop;


    sql := 'drop table res;';
    execute sql;

    return;
end;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION audio_s(IN p_date1 "timestamp", IN p_date2 "timestamp", IN step int4, OUT channel_no int4, OUT column_no int4, OUT value int4) OWNER TO serik;
...
Рейтинг: 0 / 0
01.12.2006, 11:04
    #34169583
jaga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание временной таблицы в хранимой функции
Отличный пример! Спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание временной таблицы в хранимой функции / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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