数据库为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中,不确定是定义的问题还是装入的方法有错,希望有数据库大神指点一二。
敬谢!