Postgresql 运算符不存在整数:refcursor,42883 | Postgres
我必须从3个表中删除记录。从第三个tableParent表中删除的条件是,只有在不存在子记录的情况下才应删除该表。我正在使用游标并尝试使用游标从表中删除。我试图执行函数,但我面临着标题中提到的错误。下面是我的代码:-Postgresql 运算符不存在整数:refcursor,42883 | Postgres,postgresql,cursor,Postgresql,Cursor,我必须从3个表中删除记录。从第三个tableParent表中删除的条件是,只有在不存在子记录的情况下才应删除该表。我正在使用游标并尝试使用游标从表中删除。我试图执行函数,但我面临着标题中提到的错误。下面是我的代码:- CREATE OR REPLACE FUNCTION housekeeping( OUT p_message_out CHARACTER VARYING, OUT p_sqlstate_out CHARACTER VARYING ) RETURNS RECO
CREATE OR REPLACE FUNCTION housekeeping(
OUT p_message_out CHARACTER VARYING,
OUT p_sqlstate_out CHARACTER VARYING
)
RETURNS RECORD AS
$BODY$
DECLARE
v_msg CHARACTER VARYING(160);
v_sqlstate CHARACTER VARYING(6);
v_id INTEGER;
c_del CURSOR FOR SELECT employee_id FROM notification WHERE sys_time<=CURRENT_TIMESTAMP - INTERVAL '30 Days';
v_del REFCURSOR;
BEGIN
OPEN c_del;
LOOP
FETCH c_del INTO v_del;
EXIT WHEN NOT FOUND;
delete from client where payment_id in(select payment_id from notification where sys_time<=CURRENT_TIMESTAMP - INTERVAL '30 Days');
delete from notification where sys_time<=CURRENT_TIMESTAMP - INTERVAL '30 Days';
select count(*) into v_id from notification where employee_id=v_del;
IF v_id=0 THEN
delete from employee where employee_id=v_del;
END IF;
END LOOP;
v_msg = 'Data deleted successfully.';
v_sqlstate = 1;
p_message_out = v_msg;
p_sqlstate_out = v_sqlstate;
--Exception handling
EXCEPTION WHEN OTHERS THEN
p_message_out=SQLERRM;
p_sqlstate_out=SQLSTATE;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
这样做不需要循环甚至变量 您可以使用关联子查询有条件地删除末尾的员工
CREATE OR REPLACE FUNCTION housekeeping
(
OUT p_message_out CHARACTER VARYING,
OUT p_sqlstate_out CHARACTER VARYING
)
RETURNS RECORD AS
$BODY$
BEGIN
delete from client
where payment_id in (select payment_id
from notification
where sys_time <= CURRENT_TIMESTAMP - INTERVAL '30 Days');
delete from notification
where sys_time <= CURRENT_TIMESTAMP - INTERVAL '30 Days';
-- delete all employees for which no notification exists
delete from employee emp
where not exists (select *
from notification n
where n.employee_id = emp.employee_id);
p_message_out := 'Data deleted successfully.';
p_sqlstate_out := 1;
EXCEPTION WHEN OTHERS THEN
--Exception handling
p_message_out := SQLERRM;
p_sqlstate_out := SQLSTATE;
END;
$BODY$
LANGUAGE plpgsql;
但v_id用于计算通知表中是否存在行。如果行不存在,则需要继续删除。此外,它可能包含多个员工id。因此,我们使用游标。如果我错了,请纠正我。你太棒了!!!!!!!!!!!我想用不同的例子来学习游标。你能给我推荐一些链接吗?@Nik:当你考虑使用关系数据库的游标或循环时,请重新考虑。这不是做事的自然方法。基于集合的方法几乎总是更好的选择。与其专注于学习游标,不如学习如何应用基于集合的解决方案。