用PL/pgSQL写postgreSQL的存储过程

前端之家收集整理的这篇文章主要介绍了用PL/pgSQL写postgreSQL的存储过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_404_2@

今天学会了用 PL/pgsql 写 postgresql 的存储过程,网上资料实在少得可怜,唯一能搜到的一些还是抄来抄去的;还是翻postgresql的文档吧,把今天解决的问题说一下吧,希望对其他人有帮助。
问题是这样的,有一张message表:
CREATE TABLE message
(
id int8 NOT NULL,
receiveuserid int8,
senduserid int8,
receivedelete bool DEFAULT false,
senddelete bool DEFAULT false,
……
CONSTRAINT usermessage_pkey PRIMARY KEY (id)
)
略去其他字段,senduserid是发信息的用户id,senddelete如为true则表示这条消息被发信人所删除;至于receive我就不用说了。一条信息只有被发信人和收信人都删除,才能真正从表里删除(这是显然的,否则收信人删了一条消息后,发信人的“发件箱”里就会找不到这条消息)。
所以删除消息(可能是多条消息)的时候要进行各种判断(是否是发信人?是否是收信人?是否真正删除?),用单条sql语句完成这个工作显然有些困难(当然用循环嵌套select不考虑效率的话也是可以实现的),只好写存储过程了。
顺便介绍常用的PL/pgsql结构和语法吧:

  • 结构
  • PL/pgsql是一种块结构的语言,比较方便的是用pgAdmin III新建Function,填入一些参数就可以了。基本上是这样的:

    CREATE OR REPLACE FUNCTION 函数名(参数1,[整型 int4,整型数组 _int4,...])
    RETURNS 返回值类型 AS
    $BODY$
    DECLARE
    变量声明
    BEGIN
    函数
    END;
    $BODY$
    LANGUAGE ‘plpgsql’ VOLATILE;

  • 变量类型
  • 除了postgresql内置的变量类型外,常用的还有 RECORD ,表示一条记录。

  • 赋值
  • 赋值和Pascal有点像:“变量 := 表达式;”
    有些奇怪的是连接字符串的是“||”,比如 sql := ‘SELECT * FROM’ || table || ‘WHERE …’;

  • 判断
  • 判断又和VB有些像:
    IF 条件 THEN

    ELSEIF 条件 THEN

    ELSE

    END IF;

  • 循环
  • 循环有好几种写法:
    WHILE expression LOOP
    statements
    END LOOP;
    还有常用的一种是:(从1循环到9可以写成FOR i IN 1..9 LOOP)
    FOR name IN [ REVERSE ] expression .. expression LOOP
    statements
    END LOOP;

  • 其他
  • 还有几个常用的函数
    SELECT INTO record …; 表示将select的结果赋给record变量(RECORD类型)
    PERFORM query; 表示执行query并丢弃结果
    EXECUTE sql; 表示执行sql语句,这条可以动态执行sql语句(特别是由参数传入构造sql语句的时候特别有用)

最后,贴出解决上面这个问题的存储过程吧:

  1. CREATE@H_404_2@@H_404_2@OR@H_404_2@@H_404_2@REPLACE@H_404_2@@H_404_2@FUNCTION@H_404_2@@H_404_2@message_deletes@H_404_2@(@H_404_2@ids@H_404_2@@H_404_2@"@H_404_2@varchar@H_404_2@"@H_404_2@,@H_404_2@userid@H_404_2@@H_404_2@int8@H_404_2@)@H_404_2@
  2. @H_404_2@RETURNS@H_404_2@@H_404_2@int4@H_404_2@@H_404_2@AS@H_404_2@
  3. $@H_404_2@BODY@H_404_2@$@H_404_2@
  4. DECLARE@H_404_2@
  5. @H_404_2@r@H_404_2@@H_404_2@RECORD@H_404_2@;@H_404_2@
  6. @H_404_2@del@H_404_2@@H_404_2@bool@H_404_2@;@H_404_2@
  7. @H_404_2@num@H_404_2@@H_404_2@int4@H_404_2@:=@H_404_2@0@H_404_2@;@H_404_2@
  8. @H_404_2@sql@H_404_2@@H_404_2@"@H_404_2@varchar@H_404_2@"@H_404_2@;@H_404_2@
  9. BEGIN@H_404_2@
  10. @H_404_2@sql@H_404_2@:=@H_404_2@'@H_404_2@select id,receiveuserid,senduserid,senddelete,receivedelete from message where id in (@H_404_2@'@H_404_2@||@H_404_2@ids@H_404_2@||@H_404_2@'@H_404_2@)@H_404_2@'@H_404_2@;@H_404_2@
  11. @H_404_2@FOR@H_404_2@@H_404_2@r@H_404_2@@H_404_2@IN@H_404_2@@H_404_2@EXECUTE@H_404_2@@H_404_2@sql@H_404_2@@H_404_2@LOOP@H_404_2@
  12. @H_404_2@del@H_404_2@:=@H_404_2@false@H_404_2@;@H_404_2@
  13. @H_404_2@IF@H_404_2@@H_404_2@r@H_404_2@.@H_404_2@receiveuserid@H_404_2@=@H_404_2@userid@H_404_2@@H_404_2@and@H_404_2@@H_404_2@r@H_404_2@.@H_404_2@senduserid@H_404_2@=@H_404_2@userid@H_404_2@@H_404_2@THEN@H_404_2@
  14. @H_404_2@del@H_404_2@:=@H_404_2@true@H_404_2@;@H_404_2@
  15. @H_404_2@ELSEIF@H_404_2@@H_404_2@r@H_404_2@.@H_404_2@receiveuserid@H_404_2@=@H_404_2@userid@H_404_2@@H_404_2@THEN@H_404_2@
  16. @H_404_2@IF@H_404_2@@H_404_2@r@H_404_2@.@H_404_2@senddelete@H_404_2@=@H_404_2@false@H_404_2@@H_404_2@THEN@H_404_2@
  17. @H_404_2@update@H_404_2@@H_404_2@message@H_404_2@@H_404_2@set@H_404_2@@H_404_2@receivedelete@H_404_2@=@H_404_2@true@H_404_2@@H_404_2@where@H_404_2@@H_404_2@id@H_404_2@=@H_404_2@r@H_404_2@.@H_404_2@id@H_404_2@;@H_404_2@
  18. @H_404_2@ELSE@H_404_2@
  19. @H_404_2@del@H_404_2@:=@H_404_2@true@H_404_2@;@H_404_2@
  20. @H_404_2@END@H_404_2@@H_404_2@IF@H_404_2@;@H_404_2@
  21. @H_404_2@ELSEIF@H_404_2@@H_404_2@r@H_404_2@.@H_404_2@senduserid@H_404_2@=@H_404_2@userid@H_404_2@@H_404_2@THEN@H_404_2@
  22. @H_404_2@IF@H_404_2@@H_404_2@r@H_404_2@.@H_404_2@receivedelete@H_404_2@=@H_404_2@false@H_404_2@@H_404_2@THEN@H_404_2@
  23. @H_404_2@update@H_404_2@@H_404_2@message@H_404_2@@H_404_2@set@H_404_2@@H_404_2@senddelete@H_404_2@=@H_404_2@true@H_404_2@@H_404_2@where@H_404_2@@H_404_2@id@H_404_2@=@H_404_2@r@H_404_2@.@H_404_2@id@H_404_2@;@H_404_2@
  24. @H_404_2@ELSE@H_404_2@
  25. @H_404_2@del@H_404_2@:=@H_404_2@true@H_404_2@;@H_404_2@
  26. @H_404_2@END@H_404_2@@H_404_2@IF@H_404_2@;@H_404_2@
  27. @H_404_2@END@H_404_2@@H_404_2@IF@H_404_2@;@H_404_2@
  28. @H_404_2@IF@H_404_2@@H_404_2@del@H_404_2@@H_404_2@THEN@H_404_2@
  29. @H_404_2@delete@H_404_2@@H_404_2@from@H_404_2@@H_404_2@message@H_404_2@@H_404_2@where@H_404_2@@H_404_2@id@H_404_2@=@H_404_2@r@H_404_2@.@H_404_2@id@H_404_2@;@H_404_2@
  30. @H_404_2@num@H_404_2@:=@H_404_2@num@H_404_2@+@H_404_2@1@H_404_2@;@H_404_2@
  31. @H_404_2@END@H_404_2@@H_404_2@IF@H_404_2@;@H_404_2@
  32. @H_404_2@END@H_404_2@@H_404_2@LOOP@H_404_2@;@H_404_2@
  33. @H_404_2@return@H_404_2@@H_404_2@num@H_404_2@;@H_404_2@
  34. END@H_404_2@;@H_404_2@
  35. $@H_404_2@BODY@H_404_2@$@H_404_2@
  36. @H_404_2@LANGUAGE@H_404_2@@H_404_2@'@H_404_2@plpgsql@H_404_2@'@H_404_2@@H_404_2@VOLATILE@H_404_2@;@H_404_2@

测试使用:

猜你在找的Postgre SQL相关文章