Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ? / 11 сообщений из 11, страница 1 из 1
19.08.2008, 09:25
    #35493932
dmitry@ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
Всем привет!
Похоже все вертятся вокруг одного и того же. Только начал разбираться с хранимыми процедурами.

Интересует следующее:
- есть 2 таблицы
- есть хранимая процедура, возвращает ошибку "ERROR: query has no destination for result data"


Вопрос как из запроса c параметрами в котором объеденены несколько таблиц получить select.

- таблицы
CREATE TABLE users.system_users
(
idnum_key bigserial NOT NULL,
system_groups bigint NOT NULL,
idnum_org bigint,
active bit(1),
"login" character(50) NOT NULL,
"password" character(50) NOT NULL,
last_name character(50),
first_name character(50),
middle_name character(50),
address character(255),
service_phone character(50),
home_phone character(50),
mobile_phone character(50),
mail character(50),
icq character(50),
description text,
insert_date timestamp without time zone NOT NULL DEFAULT ('now'::text)::date,
modify timestamp without time zone NOT NULL DEFAULT ('now'::text)::date
)
WITHOUT OIDS;
ALTER TABLE users.system_users OWNER TO postgres;

CREATE TABLE users.system_groups
(
idnum_key bigserial NOT NULL,
group_name character(50) NOT NULL,
access_level bigint NOT NULL,
description text,
insert_date timestamp without time zone NOT NULL DEFAULT ('now'::text)::date,
modify timestamp without time zone NOT NULL DEFAULT ('now'::text)::date
)
WITHOUT OIDS;
ALTER TABLE users.system_groups OWNER TO postgres;
COMMENT ON TABLE users.system_groups IS 'Системные группы';

-- процедура
CREATE OR REPLACE FUNCTION users.up_system_users_authentification("login" bpchar, "password" bpchar)
RETURNS SETOF record AS
$BODY$

DECLARE
login ALIAS FOR $1;
password ALIAS FOR $2;
BEGIN
SELECT su.idnum_key, su.idnum_org, su.last_name, su.first_name, su.middle_name, sg.access_level
FROM users.system_users su
left join users.system_groups sg on sg.idnum_key = su.system_groups
WHERE su.login = $1
AND su.password = $2
AND su.active = '1';
--RETURN;
END;$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER;
ALTER FUNCTION users.up_system_users_authentification("login" bpchar, "password" bpchar) OWNER TO livedv_user;
COMMENT ON FUNCTION users.up_system_users_authentification("login" bpchar, "password" bpchar) IS 'Проверка пользователя';
...
Рейтинг: 0 / 0
19.08.2008, 14:56
    #35495106
YuriyRusinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
для этого нужно написать примерно следующее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE
   query varchar;
   r record;
   ...
BEGIN
    query := <твой запрос>;
    for r in
        execute query;
    loop
        return next r;
    end loop;
end;
...
Рейтинг: 0 / 0
19.08.2008, 15:37
    #35495259
dmitry@ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
Примерно следующее не работает, уже проверил. Есть другие предложения?
...
Рейтинг: 0 / 0
19.08.2008, 16:14
    #35495368
YuriyRusinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
тады выводи как проверял, сообщения об ошибках, ....
...
Рейтинг: 0 / 0
19.08.2008, 17:49
    #35495613
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
а зачем Вам здесь процедурный язык ? почему нельзя обойтись sql ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION users.up_system_users_authentification (
  IN "login" bpchar, IN "password" bpchar,
  OUT idnum_key bigint, OUT idnum_org bigint, OUT last_name character( 50 ),
  OUT first_name character( 50 ), OUT middle_name character( 50 ), OUT access_level bigint
) RETURNS SETOF record language sql VOLATILE STRICT SECURITY DEFINER AS
$BODY$
 SELECT su.idnum_key, su.idnum_org, su.last_name, su.first_name, su.middle_name, sg.access_level
 FROM users.system_users su
 left join users.system_groups sg on sg.idnum_key = su.system_groups
 WHERE su.login = $ 1 
 AND su.password = $ 2 
 AND su.active = '1';
$BODY$;

--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
20.08.2008, 02:06
    #35495983
dmitry@ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
Спасибо за пример с использованием sql. Работает.
Здесь не идет речь об использовании именно SQL, а о том чтобы разобраться в обоих структурах, чтобы правильно соотносить маленькие и сложные запросы.

По совету в процедурном языке делаю следующее и выдает ошибку:
ERROR: a column definition list is required for functions returning "record"

CREATE OR REPLACE FUNCTION users.up_system_users_authentification("login" bpchar, "password" bpchar)
RETURNS SETOF record AS
$BODY$

DECLARE
login ALIAS FOR $1;
password ALIAS FOR $2;
query varchar;
r record;

BEGIN

for r in
loop

SELECT su.idnum_key, su.idnum_org, su.last_name, su.first_name, su.middle_name, sg.access_level
FROM users.system_users su
left join users.system_groups sg on sg.idnum_key = su.system_groups
WHERE su.login = $1
AND su.password = $2
AND su.active = '1';
return next r;
end loop;

END;$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER;

выполняем
select * from users.up_system_users_authentification('123', '123')
...
Рейтинг: 0 / 0
20.08.2008, 03:07
    #35495986
Гость_0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
dmitry@ru По совету в процедурном языке делаю следующее и выдает ошибку:
ERROR: a column definition list is required for functions returning "record"

выполняем
select * from users.up_system_users_authentification('123', '123')так и должно быть. потому что планировщик должен знать типы полей.

ERROR: a column definition list is required for functions returning "record" - переводится как: список объявляющий колонки обязателен для функций возвращающих "record"

это можно сделать указав их или в параметрах функции в качестве OUT параметра
Код: plaintext
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION users.up_system_users_authentification (
  IN "login" bpchar, IN "password" bpchar,
  OUT idnum_key bigint, OUT idnum_org bigint, OUT last_name character( 50 ),
  OUT first_name character( 50 ), OUT middle_name character( 50 ), OUT access_level bigint
) RETURNS SETOF record language sql VOLATILE STRICT SECURITY DEFINER AS

или указав их в самом запросе вызывающем функцию, приведя её результат к нужному типу:
Код: plaintext
1.
2.
3.
4.
5.
select * from users.up_system_users_authentification('123', '123')
as x(
  idnum_key bigint, idnum_org bigint, last_name character( 50 ),
  first_name character( 50 ), middle_name character( 50 ), access_level bigint
);
...
Рейтинг: 0 / 0
20.08.2008, 07:18
    #35496019
dmitry@ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
Определил типы, пишет следующее:
ERROR: RETURN NEXT cannot have a parameter in function with OUT parameters at or near "r"
...
Рейтинг: 0 / 0
20.08.2008, 18:20
    #35497775
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
исправьте
Код: plaintext
SELECT su.idnum_key, su.idnum_org, su.last_name, su.first_name, su.middle_name, sg.access_level

на

Код: plaintext
1.
SELECT INTO idnum_key, idnum_org, last_name, first_name, middle_name, access_level
su.idnum_key, su.idnum_org, su.last_name, su.first_name, su.middle_name, sg.access_level

а
Код: plaintext
return next r;
замените на просто
Код: plaintext
return next;


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
20.08.2008, 21:59
    #35498041
Степан H.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
Ёш написал совершенно правильно. лучше использовать один SQL, однакое если вам очень надо, можете использовать примерно так:

Код: 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.
CREATE OR REPLACE FUNCTION examlpe_b(vid_st integer)
  RETURNS SETOF record AS
$BODY$ DECLARE
  _result RECORD;
  _b RECORD;
  vhkor varchar;
  result varchar;
BEGIN
 FOR _b IN 
  select id_b, hnum, hlit, hkor from b_tbl where id_st=vid_st
  LOOP
 
   -- тут делаем что хотим

   SELECT 
             _b.id_b::integer, 
             _b.hnum::integer, 
             _b.hlit::varchar, 
             _b.hkor::integer  
   INTO _result;

   RETURN NEXT _result;

  END LOOP;
 RETURN;
END $BODY$
  LANGUAGE 'plpgsql' STABLE SECURITY DEFINER
  COST  100 
  ROWS  1000 ;
вызов

Код: plaintext
select * from examlpe_b( 5 ) as (id_b integer, hnum integer, hlit varchar, hkor integer);
...
Рейтинг: 0 / 0
27.08.2008, 09:12
    #35507719
dmitry@ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ?
Спасибо всем. С Вашей помощью освоил.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как из запроса c параметрами в котором объеденены несколько таблиц, получить select ? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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