postgreSQL存储过程写法示例

postgreSQL存储过程写法示例转自 http bianbian org 52 用 plpgsql 写 postgresql 的存储过程 今天学会了用 PL pgSQL 写 postgreSQL 的存储过程 网上资料实在少得可怜 唯一能搜到的一些还是抄来抄去的 还是翻 postgresql 的文档吧 把今天解决的问题说一下吧 希望对其他人有帮助 问题是这样的 有一张 message 表 CREATETABLEm

转自:http://bianbian.org/52/用plpgsql写postgresql的存储过程/

  • 结构
  • 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 varcharuserid int8)
  2.   RETURNS int4 AS
  3. $BODY$
  4. DECLARE
  5.   r RECORD;
  6.   del bool;
  7.   num int4 := 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 1;
  31.     END IF;
  32.   END LOOP;
  33.   return num;
  34. END;
  35. $BODY$
  36.   LANGUAGE plpgsql VOLATILE;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198541.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:58
下一篇 2026年3月26日 下午2:59


相关推荐

  • c++实现简单的web服务器搭建

    c++实现简单的web服务器搭建本文使用c++socket编程进行简单的web服务器搭建,出来了GET请求

    2022年5月28日
    34
  • idea 安装教程_复合门安装视频完整版

    idea 安装教程_复合门安装视频完整版IDEA的安装教程

    2022年10月2日
    8
  • 1.23 lseek函数[通俗易懂]

    1.23 lseek函数[通俗易懂]参考:牛客网C++高薪求职项目《Linux高并发服务器开发》1.22read、write函数专属优惠链接:https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG

    2022年6月24日
    26
  • 查看webpack版本命令_webpack阮一峰

    查看webpack版本命令_webpack阮一峰想着搞一下webpack的构建优化,网上看到一些方法说是要webpack4及以上的才能用。然后就要看看是啥版本来着——查看当前项目的webpack版本1.命令行执行npxwebpack-v(最方便啦)因为webpack是局部安装,要进入依赖包执行webpack的命令才有效,直接webpack-v会被认为命令无效。使用npm包执行器npx可以自动找到对应的包执行命令(一般安装了npm会自动安装npx)2.在package.json添加script命

    2022年8月10日
    50
  • 苹果电脑出现 .DS_Store文件,删除不掉怎么处理?

    苹果电脑出现 .DS_Store文件,删除不掉怎么处理?

    2022年2月3日
    70
  • 什么是java的多态

    什么是java的多态多态分为两种a.编译时多态:方法的重载;b. 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态);上述描述认为重载也是多态的一种表现,不过多态主要指运行时多态。2.运行时多态a.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。…

    2022年7月7日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号