postgresql: ИСПОЛЬЗОВАНИЕ CURSOR для извлечения данных из одной базы данных и вставки их в другую - PullRequest
2 голосов
/ 17 марта 2011

вот еще один алгоритм, использующий курсор, но мне трудно исправить его ошибку ...

CREATE OR REPLACE FUNCTION extractstudent()
RETURNS VOID AS 
$BODY$
DECLARE
    studcur SCROLL cursor FOR SELECT fname, lname, mname, address FROM student;
BEGIN    
    open studcur; 

    Loop
    --fetching 1 row at a time
    FETCH First FROM studcur;
    --every row fetched is being inserted to another database on the local site
    --myconT is the name of the connection to the other database in the local site
    execute 'SELECT * from dblink_exec(''myconT'', ''insert into temp_student values(studcur)'')';
    --move to the next row and execute again
    move next from studcur;
    --exit when the row content is already empty
    exit when studcur is null;
    end loop;

    close studcur;    

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION extractstudent() OWNER TO postgres;

Ответы [ 2 ]

6 голосов
/ 17 марта 2011

Вам редко нужно явно использовать курсоры в postgresql или pl / pgsql.То, что вы написали, выглядит подозрительно как конструкция цикла курсора SQL Server, и вам не нужно этого делать.Кроме того, вы можете использовать «PERFORM» вместо «EXECUTE» для запуска запроса и отклонения результатов: это позволит избежать повторного разбора запроса каждый раз (хотя он не может избежать разбора запроса dblink каждый раз).

Вы можете сделать что-то более похожее на это:

DECLARE
  rec student%rowtype;
BEGIN
  FOR rec IN SELECT * FROM student
  LOOP
    PERFORM dblink_exec('myconT',
      'insert into temp_student values ('
          || quote_nullable(rec.fname) || ','
          || quote_nullable(rec.lname) || ','
          || quote_nullable(rec.mname) || ','
          || quote_nullable(rec.address) || ')');
  END LOOP;
END;
0 голосов
/ 17 марта 2011

Почему бы не попробовать это самостоятельно, по ошибке, вы можете попытаться решить их шаг за шагом!

...