powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка в ХП. Временные таблицы
9 сообщений из 9, страница 1 из 1
Ошибка в ХП. Временные таблицы
    #34674214
RussianSpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь создать ХП. На попытку ее компиляции выдает ошибку


ERROR: syntax error at "TEMPORARY"
DETAIL: Expected record variable, row variable, or list of scalar variables following INTO.
CONTEXT: compile of PL/pgSQL function "getbrowsers" near line 6


Текст ХП такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION GetBrowsers(timestamp) RETURNS SETOF pie_report AS '
DECLARE
n_date ALIAS FOR $1;
report1 pie_report%ROWTYPE;
BEGIN
  SELECT DISTINCT v2.* INTO TEMPORARY TABLE tmptable1 FROM visits v1 LEFT JOIN visitors v2 ON v1.visitorid=v2.visitorid WHERE v1.visittime>=$1 AND v1.visittime<=($1+interval ''1 day''); 
  report1.varvalue = (SELECT COUNT(*) FROM tmptable1 WHERE useragent LIKE ''%MSIE 6%'');
  report1.varname = ''MSIE 6.x'';
  RETURN NEXT report1;
  report1.varvalue = (SELECT COUNT(*) FROM tmptable1 WHERE useragent LIKE ''%MSIE 7%'');
  report1.varname = ''MSIE 7.x'';
  RETURN NEXT report1;
  RETURN;   
END;
' LANGUAGE plpgsql;

Код: plaintext
1.
CREATE TYPE pie_report as (varname text, varvalue integer);

Ясно что проблема в SELECT ... INTO TEMPORARY TABLE ...
Но при всем при этом буквально вчера писал ХП с похожим синтаксисом и там все работает как надо (если нужно приведу ее код).

Кто что посоветует?

PostgreSQL 8.2.4
Debian Linux
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674279
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RussianSpyПытаюсь создать ХП. На попытку ее компиляции выдает ошибку

1. Воспользоваться поиском по форуму.
2. Воспользоваться доками.
3. Воспользоваться EXECUTE 'SELECT DISTINCT v2.* INTO TEMPORARY TABLE ...';
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674283
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите пример работающей ХП.
И пожалуйста не используйте анархизмы 7 postgres'а , уберите
AS '
' LANGUAGE plpgsql;
и замените на
AS
$$
$$
LANGUAGE plpgsql;

будет гораздо читабельнее
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674327
RussianSpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот пример работающей

Код: 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.
CREATE FUNCTION get_games_result(integer) RETURNS SETOF game_result  AS '
DECLARE
r game_result%ROWTYPE;
Row gamestatistics%ROWTYPE;
UID ALIAS FOR $1;
BEGIN
  IF UID=0 THEN
SELECT COUNT(*) as num_bets, SUM(balancechange) as balancechange, SUM(bonuschange) as bonuschange, gameid, paytype INTO TEMPORARY tab17 FROM pays WHERE gameid<>0 GROUP BY gameid, paytype;
    FOR Row IN SELECT * FROM gamestatistics LOOP
      r.gameid = Row.gameid;
      r.game_name = Row.name;
      r.num_games = (SELECT num_bets FROM tab17 WHERE paytype=0 AND gameid=Row.gameid);
      r.real_in = (SELECT SUM(balancechange) FROM tab17 WHERE paytype=0 AND gameid=Row.gameid);
      r.bonus_in = (SELECT SUM(bonuschange) FROM tab17 WHERE paytype=0 AND gameid=Row.gameid);
      r.real_out = (SELECT SUM(balancechange) FROM tab17 WHERE paytype=1 AND gameid=Row.gameid);
      r.bonus_out = (SELECT SUM(bonuschange) FROM tab17 WHERE paytype=1 AND gameid=Row.gameid);
      r.bonus_plus = (SELECT SUM(balancechange) FROM tab17 WHERE paytype=2 AND gameid=Row.gameid);
      RETURN NEXT r;
    END LOOP;
    RETURN;
  ELSE
    SELECT p.* INTO TEMPORARY tab17 FROM pays p, sessions s WHERE s.userid=UID AND s.sessionid=p.sessionid;
    FOR Row IN SELECT * FROM gamestatistics LOOP
      r.gameid = Row.gameid;
      r.game_name = Row.name;
      r.num_games = (SELECT COUNT(*) FROM tab17 WHERE paytype=0 AND gameid=Row.gameid);
      r.real_in = (SELECT SUM(balancechange) FROM tab17 WHERE paytype=0 AND gameid=Row.gameid);
      r.bonus_in = (SELECT SUM(bonuschange) FROM tab17 WHERE paytype=0 AND gameid=Row.gameid);
      r.real_out = (SELECT SUM(balancechange) FROM tab17 WHERE paytype=1 AND gameid=Row.gameid);
      r.bonus_out = (SELECT SUM(bonuschange) FROM tab17 WHERE paytype=1 AND gameid=Row.gameid);
      r.bonus_plus = (SELECT SUM(balancechange) FROM tab17 WHERE paytype=2 AND gameid=Row.gameid);
      RETURN NEXT r;
    END LOOP;
    RETURN;
  END IF;
END;
' LANGUAGE PLPGSQL;

Как видите тут используется SELECT p.* INTO TEMPORARY tab17 FROM ... и все отлично работает. скорее всего где-то мой косяк, но сам я уже не вижу. Ткните меня носом пожалуйста в ошибку.
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674395
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сравните:

SELECT DISTINCT v2.* INTO TEMPORARY TABLE tmptable1
vs
SELECT p.* INTO TEMPORARY tab17
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674408
RussianSpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это уже все перепробовано.
И дистинкт убирал и слово TABLE убирал - результат один. Я с этим уже третий день бьюсь
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674609
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RussianSpyЭто уже все перепробовано.
И дистинкт убирал и слово TABLE убирал - результат один. Я с этим уже третий день бьюсь
Неполенился. Попробовал создать вторую процедуру на все том же сервере 8.2.
Таже ошибка что и у Вас. Может все таки путь в сторону поиска (ну совсем недавно было и про грабли и про все отсальное) или сразу EXECUTE - правильный? Может стоит им пойти? Иначе можно и неделю и две пробиться над багой.
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34674726
RussianSpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена. Наиболее вероятной причиной были серьезные отличия между версиями 8.1.х и 8.2.х

Текущая реализация работает как надо.
Также последовал совету господина Thamerlan и переделал ХП в более современный вид.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION GetBrowsers(timestamp) RETURNS SETOF pie_report AS 
$$
DECLARE
n_date ALIAS FOR $ 1 ;
report1 pie_report%ROWTYPE;

BEGIN
  CREATE TEMPORARY TABLE tmptable1 AS SELECT DISTINCT v2.* FROM visits v1 LEFT JOIN visitors v2 ON v1.visitorid=v2.visitorid WHERE v1.visittime>=n_date AND v1.visittime<=(n_date+interval '1 day'); 
  report1.varvalue = (SELECT COUNT(*) FROM tmptable1 WHERE useragent LIKE '%MSIE 6%');
  report1.varname = 'MSIE 6.x';
  RETURN NEXT report1;
  report1.varvalue = (SELECT COUNT(*) FROM tmptable1 WHERE useragent LIKE '%MSIE 7%');
  report1.varname = 'MSIE 7.x';
  RETURN NEXT report1;
  RETURN;   
END;
$$
LANGUAGE plpgsql;

Спасибо всем кто пытался помочь

OFFTOPIC: К слову катализатором решения проблемы стали два бокала самбуки. ;-)
...
Рейтинг: 0 / 0
Ошибка в ХП. Временные таблицы
    #34676815
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RussianSpyПроблема решена. Наиболее вероятной причиной были серьезные отличия между версиями 8.1.х и 8.2.х

Текущая реализация работает как надо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION GetBrowsers(timestamp) RETURNS SETOF pie_report AS 
$$
--...
  CREATE TEMPORARY TABLE tmptable1 AS SELECT DISTINCT v2.* FROM visits v1 LEFT JOIN visitors v2
 --...
$$
LANGUAGE plpgsql;

гм. это похоже ответ в т.ч. на некие проблемы с использованием SELECT FROM OLD.* [|New.*] INTO TEMPORARY ...

т.е. сермяга видимо в том чтобы использовать
Код: plaintext
CREATE TEMPORARY TABLE ... AS SELECT
вместо
Код: plaintext
SELECT ... INTO 
внутре плпгскулёвой хп.

сэнкс.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка в ХП. Временные таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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