PostgreSQL -Итерировать результат запроса и сделать выбор на основе значения итерации. - PullRequest
0 голосов
/ 27 марта 2020

У меня есть 3 таблицы Person, Address и Person_adress.

Я пишу скрипт с массивом address_code в качестве записи.

Цель скрипта - показать имя и электронная почта каждого человека, живущего на каждом адресе. Затем создайте базу для каждого имени, затем выполните процедуру для каждого письма, затем обновите адрес

, вот мой сценарий:

do $$ 

DECLARE 
-- L'ensemble des adresses  
address_codes varchar [] := '{"AF_X1", "AD_X3", "AC_S4"}';
v_code varchar; 
v_id_person varchar;    
v_firstname_person varchar;
    v_email varchar;


BEGIN   
FOREACH v_code in array address_codes
LOOP        
    FOR v_id_person IN SELECT pa.person_id from person_address pa, address a WHERE pa.address_id=a.id AND a.code=v_code
    LOOP
        RAISE NOTICE 'Traitement de la personne %', v_id_person;
        -- Recuperation du nom de la personne
        SELECT pe.firstname INTO v_firstname_person from person pe where pe.id = v_id_person;
        SELECT pe.email INTO v_email from person pe where pe.id = v_id_person;
        RAISE NOTICE 'the firstname of person is %', v_firstname_person;

                   RAISE NOTICE 'the email of person is %', v_email;

        --Here is some treatment based on v_firstname_person value
    --Here I some treatment based on v_email value  
       END LOOP;    

      UPDATE address SET etat="DONE" where code = v_code;      
    END LOOP;       
END;

$$;

Но значение v_firstname_person по-прежнему равно NULL.

здесь вывод, который у меня есть

, имя пользователя - NULL

i есть значения в моей базе данных;

Как мне решить эту проблему, пожалуйста;

1 Ответ

0 голосов
/ 27 марта 2020

Вам нужен только один l oop, чтобы перебрать строки в таблице person.

Чтобы найти их, вы можете использовать условие EXISTS, используя массив в качестве параметра для предложения WHERE:

do $$ 
DECLARE 
  -- L'ensemble des adresses  
  address_codes varchar [] := '{"AF_X1", "AD_X3", "AC_S4"}';
  v_firstname_person varchar;
  v_email varchar;
  l_prec record;
BEGIN   
  FOR l_prec in IN SELECT pe.*
                FROM person pe 
                WHERE EXISTS (select *
                              FROM person_address pa 
                                join address a on pa.address_id = a.id 
                              WHERE pe.ref_douane = pa.person_id
                                AND a.code = any(address_codes);
  LOOP
    -- not really necessary, but keeps your current variables
    v_firstname := l_prec.firstname;
    v_email := l_prec.email;

    RAISE NOTICE 'the firstname of person is %', v_firstname;
    RAISE NOTICE 'the email of person is %', v_email;

    --Here is some treatment based on v_firstname_person value
    --Here I some treatment based on v_email value  
  END LOOP;

  UPDATE address 
     SET etat='DONE' --<< String constants need single quotes, not double quotes
  where code = any(address_codes);
END;
$$;

Обратите внимание, что в вашем текущем коде эти два оператора:

SELECT pe.firstname INTO v_firstname_person from person pe where pe.id = v_id_person;
SELECT pe.email INTO v_email from person pe where pe.id = v_id_person;

можно объединить в один:

SELECT pe.firstname, pe.email
   INTO v_firstname_person, v_email
from person pe 
where pe.id = v_id_person;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...