Я пытаюсь удалить все данные, связанные с идентификатором пользователя, из базы данных игры.
Существует таблица со всеми играми (в каждую играют 3 игрока):
# select * from pref_games where gid=321;
gid | rounds | finished
-----+--------+----------------------------
321 | 17 | 2011-10-26 17:16:04.074402
(1 row)
И есть таблица с очками игроков для этой игры № 321:
# select * from pref_scores where gid=321;
id | gid | money | quit
----------------+-----+-------+------
OK531282114947 | 321 | 218 | f
OK501857527071 | 321 | -156 | f
OK429671947957 | 321 | -62 | f
Когда я пытаюсь выполнить следующую инструкцию SELECT INTO в приглашении psql PostgreSQL, кажется, что она работает так, как ожидалось (и временная таблица исчезает при закрытии сеанса):
# select gid into temp temp_gids from pref_scores where id='OK446163742289';
SELECT
# select * from temp_gids ;
gid
------
1895
1946
1998
2094
2177
2215
(6 rows)
Но когда я пытаюсь создать свою процедуру PL/pgSQL, я получаю сообщение об ошибке:
create or replace function pref_delete_user(_id varchar)
returns void as $BODY$
begin
select gid into temp temp_gids from pref_scores where id=_id;
delete from pref_scores where gid in
(select gid from temp_gids);
delete from pref_games where gid in
(select gid from temp_gids);
delete from pref_rep where author=_id;
delete from pref_rep where id=_id;
delete from pref_catch where id=_id;
delete from pref_game where id=_id;
delete from pref_hand where id=_id;
delete from pref_luck where id=_id;
delete from pref_match where id=_id;
delete from pref_misere where id=_id;
delete from pref_money where id=_id;
delete from pref_pass where id=_id;
delete from pref_status where id=_id;
delete from pref_users where id=_id;
end;
$BODY$ language plpgsql;
Ошибка:
ERROR: syntax error at "temp"
DETAIL: Expected record variable, row variable, or list of scalar variables following INTO.
CONTEXT: compilation of PL/pgSQL function "pref_delete_user" near line 3
Почему это (временные таблицы здесь запрещены?) и где сохранить мой временный список удаляемых gid?
(И я бы предпочел не использовать «каскад при удалении», потому что я еще не привык к этому, и мои сценарии/база данных еще не готовы к этому).
SELECT INTO
имеет другое значение в plpgsql. - person Michael Krelin - hacker   schedule 28.10.2011