postgresql – 在PL / pgSQL过程中使用临时表来清理表

前端之家收集整理的这篇文章主要介绍了postgresql – 在PL / pgSQL过程中使用临时表来清理表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从游戏数据库删除用户ID相关的所有数据.

有一张桌子可容纳所有游戏(每个游戏由3名玩家扮演):

  1. # select * from pref_games where gid=321;
  2. gid | rounds | finished
  3. -----+--------+----------------------------
  4. 321 | 17 | 2011-10-26 17:16:04.074402
  5. (1 row)

并且有一张桌子可以控制该游戏的玩家分数#321:

  1. # select * from pref_scores where gid=321;
  2. id | gid | money | quit
  3. ----------------+-----+-------+------
  4. OK531282114947 | 321 | 218 | f
  5. OK501857527071 | 321 | -156 | f
  6. OK429671947957 | 321 | -62 | f

当我在Postgresql的psql-prompt上尝试以下SELECT INTO语句时,它似乎按预期工作(当会话关闭时临时表消失):

  1. # select gid into temp temp_gids from pref_scores where id='OK446163742289';
  2. SELECT
  3.  
  4. # select * from temp_gids ;
  5. gid
  6. ------
  7. 1895
  8. 1946
  9. 1998
  10. 2094
  11. 2177
  12. 2215
  13. (6 rows)

但是当我尝试创建我的PL / pgsql过程时,我收到错误

  1. create or replace function pref_delete_user(_id varchar)
  2. returns void as $BODY$
  3. begin
  4.  
  5. select gid into temp temp_gids from pref_scores where id=_id;
  6. delete from pref_scores where gid in
  7. (select gid from temp_gids);
  8. delete from pref_games where gid in
  9. (select gid from temp_gids);
  10.  
  11. delete from pref_rep where author=_id;
  12. delete from pref_rep where id=_id;
  13.  
  14. delete from pref_catch where id=_id;
  15. delete from pref_game where id=_id;
  16. delete from pref_hand where id=_id;
  17. delete from pref_luck where id=_id;
  18. delete from pref_match where id=_id;
  19. delete from pref_misere where id=_id;
  20. delete from pref_money where id=_id;
  21. delete from pref_pass where id=_id;
  22. delete from pref_status where id=_id;
  23. delete from pref_users where id=_id;
  24.  
  25. end;
  26. $BODY$language plpgsql;

错误

  1. ERROR: Syntax error at "temp"
  2. DETAIL: Expected record variable,row variable,or list of scalar variables following INTO.
  3. CONTEXT: compilation of PL/pgsql function "pref_delete_user" near line 3

为什么(临时表不允许在这里?)以及保存我要删除的gid临时列表的位置?

(而且我不想使用“删除级联”,因为我还没有习惯它,我的脚本/数据库还没有准备好).

您可以创建临时表,然后执行通常的INSERT … SELECT作为单独的操作:
  1. create temporary table temp_gids (gid int not null) on commit drop;
  2. insert into temp_gids (gid) select gid from pref_scores where id = _id;

如果要复制表的结构,还有一个LIKE option to CREATE TABLE

LIKE parent_table [ like_option ... ]
The LIKE clause specifies a table from which the new table automatically copies all column names,their data types,and their not-null constraints.

但我认为你只需要一个临时表来保存一些ID,这样就可能有些过分了.

SELECT INTO按预期工作outside a procedure

[…] this form of SELECT INTO is not available in ECPG or PL/pgsql,because they interpret the INTO clause differently.

SELECT INTO用于将SELECT的结果存储在局部变量inside a PostgreSQL procedure中:

The result of a sql command yielding a single row (possibly of multiple columns) can be assigned to a record variable,row-type variable,or list of scalar variables. This is done by writing the base sql command and adding an INTO clause.

猜你在找的Postgre SQL相关文章