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

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

Согласен, что обсуждалась - но относительно MS SQL Server , и там конкретно сказали, что в хранимых процедурах временные таблицы использовать нельзя. Может и в PostgreSQL тоже нельзя?
Только где это явно в документации прописано? Я найти не смог.
...
Рейтинг: 0 / 0
Создание временной таблицы в хранимой функции
    #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
Создание временной таблицы в хранимой функции
    #34169583
jaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отличный пример! Спасибо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание временной таблицы в хранимой функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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