powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема с функцией.
6 сообщений из 6, страница 1 из 1
Проблема с функцией.
    #35344958
DenMin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть функция:
CREATE OR REPLACE FUNCTION "public"."temp111" () RETURNS SETOF "public"."temp" AS
$body$
DROP TABLE IF EXISTS temp11;
create temporary table temp11(
"ddate" DATE,
"ttime" TIME WITHOUT TIME ZONE,
"ihwnd" INTEGER,
"mode" INTEGER,
"path" CHAR(512),
"comp_name" CHAR(256)
);
SELECT
public.process_inf.ddate,
public.process_inf.ttime,
public.process_inf.ihwnd,
public.process_inf.mode,
public.process_inf."path",
public.comp_name_id.comp_name
FROM
public.comp_name_id
INNER JOIN public.process_inf ON (public.comp_name_id.id = public.process_inf.comp_id)
WHERE
(public.process_inf.ddate >= '05-01-2008') AND
(public.process_inf.ddate <= '05-05-2008') AND
((public.process_inf."path" ILIKE '%\WINWORD.EXE%') OR
(public.process_inf."path" ILIKE '%\EXCEL.EXE%'))
ORDER BY
public.process_inf.ddate,
public.comp_name_id.comp_name,
public.process_inf.ihwnd,
public.process_inf.mode DESC;
$body$
LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

где,
RETURNS SETOF "public"."temp" - представление (view).

Мне надо чтобы функция не только создавала таблицу, но и писала туда выбранные данные, чтобы потом temporary table temp11 можно было обработать. А сейчас мне только выводятся данные через view. Пытаюсь написать select .... into temp11 или create temp table temp11 as select ... - pgAdmin ругается.
Подскажите пожалуйста что можно сделать. Пробовал у функции на выход выставлять разные типы, не помогает.
Заранее благодарен.
...
Рейтинг: 0 / 0
Проблема с функцией.
    #35345421
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Команда:   CREATE TABLE AS
Описание:  создать новую таблицу из результатов запроса
Синтаксис:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace ]
    AS query

Команда:   SELECT INTO
Описание:  создать новую таблицу из результатов запроса
Синтаксис:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ AS output_name ] [, ...]
    INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]
    [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]

авторpgAdmin ругается.как именно ? версия postgres какая ?



--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Проблема с функцией.
    #35345452
DenMin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
используя AS или INTO пишу так:
DROP TABLE IF EXISTS temp11;
create temporary table temp11(
"ddate" DATE,
"ttime" TIME WITHOUT TIME ZONE,
"ihwnd" INTEGER,
"mode" INTEGER,
"path" CHAR(512),
"comp_name" CHAR(256)
) AS
SELECT
public.process_inf.ddate,
public.process_inf.ttime,
public.process_inf.ihwnd,
public.process_inf.mode,
public.process_inf."path",
public.comp_name_id.comp_name
--INTO temp11
FROM
public.comp_name_id
INNER JOIN public.process_inf ON (public.comp_name_id.id = public.process_inf.comp_id)
WHERE

то ругается так

ERROR: syntax error at or near "AS"
SQL state: 42601
Character: 202

версия postgresql 8.2.
...
Рейтинг: 0 / 0
Проблема с функцией.
    #35345508
DenMin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все работает. написал
SELECT
public.process_inf.ddate,
public.process_inf.ttime,
public.process_inf.ihwnd,
public.process_inf.mode,
public.process_inf."path",
public.comp_name_id.comp_name
INTO TEMPORARY TABLE temp11
FROM
public.comp_name_id
INNER JOIN public.process_inf ON (public.comp_name_id.id = public.process_inf.comp_id)
WHERE
...
Рейтинг: 0 / 0
Проблема с функцией.
    #35345690
DenMin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
запрос работает, а процедуру не создает. вот я написал
CREATE OR REPLACE FUNCTION rrr(OUT "process_inf.ddate" date, OUT "process_inf.ttime" time without time zone, OUT "process_inf.ihwnd" integer, OUT "process_inf.mode" integer, OUT "process_inf.mode" bpchar, OUT "comp_name_id.comp_name" bpchar)
RETURNS SETOF record AS
$BODY$
DROP TABLE IF EXISTS temp11;
SELECT
public.process_inf.ddate,
public.process_inf.ttime,
public.process_inf.ihwnd,
public.process_inf.mode,
public.process_inf."path",
public.comp_name_id.comp_name
INTO TEMPORARY TABLE temp11
FROM
public.comp_name_id
INNER JOIN public.process_inf ON (public.comp_name_id.id = public.process_inf.comp_id)
WHERE
(public.process_inf.ddate >= '05-01-2008') AND
(public.process_inf.ddate <= '05-05-2008') AND
((public.process_inf."path" ILIKE '%\WINWORD.EXE%') OR
(public.process_inf."path" ILIKE '%\EXCEL.EXE%'))
ORDER BY
public.process_inf.ddate,
public.comp_name_id.comp_name,
public.process_inf.ihwnd,
public.process_inf.mode DESC;
select * from temp11;$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION rrr(OUT "process_inf.ddate" date, OUT "process_inf.ttime" time without time zone, OUT "process_inf.ihwnd" integer, OUT "process_inf.mode" integer, OUT "process_inf.mode" bpchar, OUT "comp_name_id.comp_name" bpchar) OWNER TO denis;

а вот что он мне пишет
ERROR: relation "temp11" does not exist
SQL state: 42P01
Context: SQL function "rrr"
я понимаю нет такой таблицы, а что можно сделать?
...
Рейтинг: 0 / 0
Проблема с функцией.
    #35346072
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на sql наверное никак, можно например на plpgsql:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function rrr () returns setof record language plpgsql as $$
declare
  r record;
begin
  drop table if exists z;
  create temp table z as select * from a;
  for r in execute 'select * from z' loop return next r; end loop;
end$$;
для 8.3 можно без execute и цикла:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function rrr () returns setof record language plpgsql as $$
declare
  r record;
begin
  drop table if exists z;
  create temp table z as select * from a;
  return query select * from z;
end$$;



--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема с функцией.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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