Eğer PDO ve PostgreSQL kullanarak birden çok sonuç kümesi iade edebilir miyim?

2 Cevap php

Ben PostgreSQL yaşayan tek bir işleve grup birden fazla sorguları istiyorum. Fonksiyon PDO kullanarak sorgulanacak.

Fonksiyonu:

CREATE OR REPLACE FUNCTION "test_multipe_refcursor"() 
RETURNS SETOF refcursor AS $BODY$

DECLARE
    parentRC refcursor;
    childRC refcursor;

BEGIN

open parentRC FOR
SELECT * FROM parent;
RETURN NEXT parentRC;

open childRC FOR
SELECT * FROM child;
RETURN NEXT childRC;

RETURN;

END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

ALTER FUNCTION "test_multipe_refcursor"() OWNER TO postgres;

Burada PHP kodu bulunuyor. Her zamanki bağlantı özelliklerini ayarlar bir tek sınıf, özel bir şey olarak "Database".

  $database = Database::load();
  $sql = "select * from test_multipe_refcursor();";
  $p = $database->query($sql);

  $i = 1;
  do
  {
     $this->set('set' . $i, $p->fetchAll(PDO::FETCH_ASSOC));
     $i++;
  } while ($p->nextRowset());

  $p->closeCursor();

Ve sonuç.

 PDOException: SQLSTATE[IM001]: Driver does not support this function: driver does not support multiple rowsets in xxxx.php on line 32

Bu desteklenmiyor olduğunu belirtmek gibi görünüyor, ama sonra tekrar, ben ne olduğunu tam olarak tanımlayan bir listesini bulamıyorum.

Herkes bu çalışma almak başardı?

Referanslar:

2 Cevap

Birden çok resultsets dönen desteği PostgreSQL todo list hala ve kesinlikle 8,4 girmeyecektir. Fonksiyon birden çok satır kümeleri dönen değil çünkü setof refcursors yönteminde olduğu gibi, ne yapmaya çalışıyorsun çalışmıyor - bu refcursors biri satırkümesi dönüyor. Refcursors istemci tarafında kullanarak çalışır eğer ben emin değilim, ama ben istemci-sunucu protokolüdür destekliyorsa bile, büyük olasılıkla bulmuyorum, PDO bunun için bir API vardır olası değildir.

Ama neden tek bir sorguda birden resultsets dönmek için çalışıyorsun? Sen her zaman ayrı ayrı sorguları yapabilirsiniz.

Alt yakın this PostgreSQL doc page, bir fonksiyonun geri bir veya daha fazla imleçler iletebilirsiniz anlatan bir bölüm vardır. Temelde, parametre olarak imleç (ler) in adını belirtmek için arayan olsun:

CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
    OPEN $1 FOR SELECT * FROM table_1;
    RETURN NEXT $1;
    OPEN $2 FOR SELECT * FROM table_2;
    RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;

-- need to be in a transaction to use cursors.
BEGIN;

SELECT * FROM myfunc('a', 'b');

FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;

Sayfa PostgreSQL 8.4 içindir, ancak bu belgeler pasajı en az kadar geri 8.1 olarak (sürüm koşuyorum) mevcuttur. Yorum diyor onlar örtülü her işlemin sonunda kapalı olarak (autocommit modu açıksa, her ifadenin sonunda yani), siz, imleçler kullanmak için bir hareket içinde olması gerekir.