匿名函数
DO关键字用来执行一段一次性的匿名函数,具体可以看这篇文章:PostgreSQL - pl/pgsql的DO关键字
遍历数据,变量赋值
遍历操作以及变量赋值操作需要在匿名函数脚本中使用,且匿名函数在执行时必须显示开启事务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | begin; DO $body$ declare targetId bpchar(32); update_sr RECORD; begin --遍历表中符合条件的数据 for update_sr in ( select temp.* from tab_test temp inner join tab_student sr on sr.id = temp.id where sr.is_latest is true ) loop select max(id) into targetId from tab_student where ref_no = update_sr.ref_no; if targetId is not null then --操作数据等 end if; end loop; END; $body$ LANGUAGE PLPGSQL; commit; |
---|
上面的脚本中使用了for loop
来遍历数据,需要注意的是,在遍历时会将数据缓存起来,如果在遍历时改变了被遍历的数据,是不会影响到被缓存的数据的。如果此时需要使用到被更改的值,只能通过赋值给临时变量来获取到被更改的值。
在变量赋值时,可以用select max(xx) into
的写法。使用max()
的目的是,如果select不到数据则会返回null,避免在变量赋值时出错。
插入其他表的数据
1 2 3 4 | INSERT INTO tab_test (id, name, ref_no, version) select id, name, ref_no, version from tab_student; |
---|
使用insert into ... select from ...
来插入其他表的数据,也可以是同一个表,但此时需要起表别名来区分数据。且这种写法,需要两个表都存在才行。
修改多个列的值
在修改的列数量较少时,可以用下面的写法:
1 | update tab_test set name = 'new name', ref_no = 'new ref_no' where id = '1'; |
---|
如果列非常多时,比如同时改几十上百个,可以用下面的写法简单点:
1 2 3 | update tab_test set (name, ref_no, version) = ('new name', 'new ref_no', 2) where id = '1'; |
---|
update语句怎么关联其他表
PostgreSQL的update语句关联外表的写法与MySQL不同,具体可以看这篇文章:PostgreSQL - update语句怎么关联多个表
此外,update语句也可以连接自身的表,只要起了表别名将二者区分开来就行。