转自: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语句的时候特别有用)
最后,贴出解决上面这个问题的存储过程吧:
- CREATE
OR REPLACE FUNCTION message_deletes(ids “varchar“, userid int8) -
RETURNSint4 AS - $BODY$
- DECLARE
-
rRECORD; -
delbool; -
numint4 := 0; -
sql“varchar“; - BEGIN
-
sql:= ‘select id,receiveuserid,senduserid,senddelete,receivedelete from message where id in (‘|| ids|| ‘)‘; -
FORr IN EXECUTE sql LOOP -
del:= false; -
IFr.receiveuserid=userid and r.senduserid=userid THEN -
del:= true; -
ELSEIFr.receiveuserid=userid THEN -
IFr.senddelete=false THEN -
updatemessage set receivedelete=true where id = r.id; -
ELSE -
del:= true; -
ENDIF; -
ELSEIFr.senduserid=userid THEN -
IFr.receivedelete=false THEN -
updatemessage set senddelete=true where id = r.id; -
ELSE -
del:= true; -
ENDIF; -
ENDIF; -
IFdel THEN -
deletefrom message where id = r.id; -
num:= num+ 1; -
ENDIF; -
ENDLOOP; -
returnnum; - END;
- $BODY$
-
LANGUAGE‘plpgsql‘ VOLATILE;
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198541.html原文链接:https://javaforall.net
