Оператор не существует целое число: refcursor, 42883 | Postgres - PullRequest
0 голосов
/ 28 августа 2018

Я должен удалить записи из 3 таблицы. Условие удаления из третьей таблицы (родительской таблицы) заключается в том, что ее следует удалять только в том случае, если для нее нет дочерней записи. Я использую курсор и пытаюсь удалить из таблиц используя курсор. Я пытаюсь выполнить функцию, но я сталкиваюсь с ошибкой, указанной в заголовке. Ниже мой код: -

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

1 Ответ

0 голосов
/ 28 августа 2018

Нет необходимости в циклах или даже переменных для этого.

Вы можете использовать связанный подзапрос для условного удаления сотрудников в конце.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...