Postgre SQL   发布时间:2022-05-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了用PL/pgSQL写postgreSQL的存储过程大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

今天学会了PL/pgSQLPOSTGResql 的存储过程,网上资料实在少得可怜,唯一能搜到的一些还是抄来抄去的;还是翻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,填入一些参数就可以了。基本上是这样的

  • 变量类型
  • 除了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 OR replaCE FUNCTION message_deletes ( IDs " varchar " , userID int8 )
  2. RETURNS int4 AS
  3. $ BODY $
  4. DECLARE
  5. r RECORD ;
  6. del bool ;
  7. num int4 := @H_450_167@0 ;
  8. sql " varchar " ;
  9. BEGIN
  10. sql := ' SELEct ID,receiveuserID,senduserID,senddelete,receivedelete from message where ID in ( ' || IDs || ' ) ' ;
  11. FOR r IN EXECUTE sql LOOP
  12. del := false ;
  13. IF r . receiveuserID = userID and r . senduserID = userID THEN
  14. del := true ;
  15. ELSEIF r . receiveuserID = userID THEN
  16. IF r . senddelete = false THEN
  17. update message set receivedelete = true where ID = r . ID ;
  18. ELSE
  19. del := true ;
  20. END IF ;
  21. ELSEIF r . senduserID = userID THEN
  22. IF r . receivedelete = false THEN
  23. update message set senddelete = true where ID = r . ID ;
  24. ELSE
  25. del := true ;
  26. END IF ;
  27. END IF ;
  28. IF del THEN
  29. delete from message where ID = r . ID ;
  30. num := num + @H_450_167@1 ;
  31. END IF ;
  32. END LOOP ;
  33. return num ;
  34. END ;
  35. $ BODY $
  36. LANGUAGE ' plpgsql ' VolATILE ;

测试使用:

ALTER FUNCTION updateUserAccout(userid integer,nMoney @R_874_8056@r)owneR TO armory;

意思为:让armory用户拥有使用updateUserAccout函数的权限

大佬总结

以上是大佬教程为你收集整理的用PL/pgSQL写postgreSQL的存储过程全部内容,希望文章能够帮你解决用PL/pgSQL写postgreSQL的存储过程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: