项目中遇到测试,需要造4500数据,而且需要分部门和日期,一个部门一天30条数据,剩下的铺垫数据可以一个部门一天100w左右数据,这里,每次变换部门,日期,需要操作至少300次,想到用存储过程写一个函数进行
首先,了解存储过程的语法:
CREATE [ OR REPLACE ] FUNCTION name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [, ...] ] ) [ RETURNSrettype | RETURNS TABLE (column_namecolumn_type[, ...] ) ] { LANGUAGElang_name | WINDOW | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COSTexecution_cost | ROWSresult_rows | SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol' } ... [ WITH (attribute[, ...] ) ] ————————————————
CREATE [ OR REPLACE ] FUNCTION--创建一个函数,若有此函数,即取代重新创建 name -------函数名称
RETURNS---函数返回类型
具体的函数声明,请参考[postgresql存储过程]
下面说我写的函数:
CREATE OR REPLACE FUNCTION "xue"."insert_into_table"() RETURNS "pg_catalog"."void" AS $BODY$ DECLARE tmp VARCHAR(1024); DECLARE n integer; DECLARE i integer; DECLARE inst_seq_no CURSOR FOR SELECT inst_seq_no FROM t where no in ( '111','22','223','33','4358', '233','449','315','35335'); BEGIN RAISE NOTICE '------------start----------'; i := 30; FOR stmt IN no LOOP n := 30; FOR n IN n..i LOOP insert into test2 (NO, test_NO,TIME,USER_NO,SEQ_NO, NAME,USER_NO1,USER_NAME,CODE,USER_NO2,OPROR_NAME, REVIEW_TIME,DESC, VAL1,VAL2,DATE,UPD_TIME,DEL_FLAG) values (nextval('seq_test2'),n,'20190910',n,stmt.seq_no,n,n,n,n,n,n,'20190910','01','',n,n,'20190910', '20190909','0'); END LOOP; n = n+30; i = i+30; END LOOP; RAISE NOTICE '-----------finished---------'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100`
很简单的逻辑,但是在修改了三四遍才实现,这个第二次写存储过程,很多语法不是很熟悉,要注意的如:
1.`变量声明要用DECLARE
2.``游标 CURSOR 的用法
3.for循环要在begin中执行,
4.循环中要用“:=”
补充:Postgresql中存储过程(函数)调用存储过程(函数)时应用注意的问题
在postgresql中我们在执行存储过程中往往会使用select 存储过程,但是如果存储过程中再调用 存储过程时,就不能这样用了,应该用perform 存储过程,可以去参考官方文档的说明
执行一个没有结果的表达式或者命令
有时候我们希望计算一个表达式或者一个命令,但是却丢弃其结果(通常因为我们经常调用一些存在有用的副作用但是不存在有用结果值的函数)。 要在 PL/pgSQL 里干这件事, 你可以使用PERFORM语句:
PERFORM query;
这条语句执行一个 query并且丢弃结果。 query 的写法和你平常写 SQL SELECT 命令是一样的, 只是把开头的关键字 SELECT 替换成 PERFORM。 PL/pgSQL 的变量和平常一样代换到命令中。 同样,如果命令生成至少一行,那么特殊的变量 FOUND 设置为真,如果没有生成行,则为假。
注意: 我们可能希望没有INTO子句的SELECT也能满足这样的需要, 但是目前可以接受的唯一的方法是PERFORM。
一个例子:
PERFORM create_mv('cs_session_page_requests_mv', my_query);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。