记录一下处理一批脏数据使用到的存储过程

数据库为postgresql,遇到的问题是同一案件出现了重复序号的文书,这批文书不能删除,也不想修改其他正常的文书,在未使用存储过程前想到的办法是使用最大序号加随机数来保证

UPDATE db_gyfw.t_wsfw_ws ws
SET n_wsxh = (
	SELECT
		MAX (n_wsxh) + CEIL(random()*(10-1)+1)
	FROM
		db_gyfw.t_wsfw_ws
	WHERE
		c_bh_aj = ws.c_bh_aj
)
WHERE
	ws.c_bh IN (
		SELECT
			s.c_bh
		FROM
			t_wsfw_ws s
		LEFT JOIN t_wsfw_wsmb b ON b.c_bh = s.c_bh_mb,
		(
			SELECT
				c_bh_aj,
				n_wsxh
			FROM
				t_wsfw_ws
			GROUP BY
				c_bh_aj,
				n_wsxh
			HAVING
				COUNT (n_wsxh) > 1
		) T
	WHERE
		T .c_bh_aj = s.c_bh_aj
	AND T .n_wsxh = s.n_wsxh
	AND s.n_yx = 1
	AND s.c_bh_glws IS NULL /*去除上网文书*/
	AND s.c_bh_aj IS NOT NULL
	AND s.c_bh_aj != 'null' /*AND b.n_gk != 1 去除会公开的裁判文书*/
	)

上面这种方式也可以解决,但是不太美观,因此改用存储过程。
自从上学以来只粗略了解过存储过程,从来没有真的用到过,这一次为了填好前人留下的坑,献上我的处女秀了…

CREATE
OR REPLACE FUNCTION updateRepeatedWsxh () RETURNS INTEGER AS $body$
DECLARE total INTEGER ; i INT := 1 ; repeated CHAR [] ; bh VARCHAR ;
BEGIN
	raise notice '=================================此处是日志================================' ; 
	raise notice 'i= %',i ;
	SELECT
		"count"(s.c_bh) INTO total
	FROM
		t_wsfw_ws s
	LEFT JOIN t_wsfw_wsmb b ON b.c_bh = s.c_bh_mb,
	(
		SELECT
			c_bh_aj,
			n_wsxh
		FROM
			t_wsfw_ws
		GROUP BY
			c_bh_aj,
			n_wsxh
		HAVING
			COUNT (n_wsxh) > 1
	) T
WHERE
	T .c_bh_aj = s.c_bh_aj
AND T .n_wsxh = s.n_wsxh
AND s.n_yx = 1
AND s.c_bh_glws IS NULL /*去除上网文书*/
AND s.c_bh_aj IS NOT NULL
AND s.c_bh_aj != 'null' /*AND b.n_gk != 1 去除会公开的裁判文书*/ ; raise notice 'total= %',
 total ; FOR bh IN (SELECT
		s.c_bh 
	FROM
		t_wsfw_ws s
	LEFT JOIN t_wsfw_wsmb b ON b.c_bh = s.c_bh_mb,
	(
		SELECT
			c_bh_aj,
			n_wsxh
		FROM
			t_wsfw_ws
		GROUP BY
			c_bh_aj,
			n_wsxh
		HAVING
			COUNT (n_wsxh) > 1
	) T
WHERE
	T .c_bh_aj = s.c_bh_aj
AND T .n_wsxh = s.n_wsxh
AND s.n_yx = 1
AND s.c_bh_glws IS NULL /*去除上网文书*/
AND s.c_bh_aj IS NOT NULL
AND s.c_bh_aj != 'null' /*AND b.n_gk != 1 去除会公开的裁判文书*/) loop UPDATE db_gyfw.t_wsfw_ws
SET n_wsxh = (
	SELECT
		MAX (n_wsxh) + i
	FROM
		db_gyfw.t_wsfw_ws ws
	WHERE
		ws.c_bh_aj = (SELECT c_bh_aj FROM db_gyfw.t_wsfw_ws WHERE c_bh=bh)
)
WHERE
	c_bh = bh ;
  raise notice 'bh= %',bh ;
END loop ; RETURN total ;
END $body$ LANGUAGE plpgsql;

这里已经解决问题了,但是存储过程的使用中还是有问题没能解决,我始终没有办法将查询出来的结果放入repeated中,不确定是定义的问题还是装入的方法有错,希望有数据库大神指点一二。
敬谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值