2011-07-13 7 views
9

Ben PostgreSQL'i 8.3 kullanıyorum vebir refcursor

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$ 
DECLARE 
     ref_cursor REFCURSOR; 
BEGIN 
     OPEN ref_cursor FOR SELECT * FROM some_table; 
     RETURN (ref_cursor);  
END; 
$$ LANGUAGE plpgsql; 

Şimdi istemciye bir refcursor dönecektir Aşağıdaki basit işlevi vardır am döndüren bir işlev çağırma, ben aşağıdaki SQL bu işlevi çağırmak için komutlarını kullanabilir ve geri imleci yönlendirmek ama imleç adı otomatik 38.7.3.5. Returning Cursors .Can I de tarif edildiği gibi açık bir şekilde fonksiyon giriş parametresi olarak imleç adı ilan yanı sıra, PostgreSQL

BEGIN; 
SELECT function_1(); --It will output the generated cursor name , for example , "<unnamed portal 11>" ; 
FETCH 4 from "<unnamed portal 11>"; 
COMMIT; 

tarafından oluşturulan kendi imleç ismimi clare ve Postgresql yerine otomatik olarak benim için döner imleci manipüle etmek için bu imleç adını kullanın? Değilse, oluşturulan imleç adını alabilecek herhangi bir komut var mı?

+0

+1, ilginç bir soru –

cevap

3

Evet, kullanın:

CREATE OR REPLACE FUNCTION function_1(refcursor) RETURNS refcursor AS $$ 
BEGIN 
     OPEN $1 FOR SELECT * FROM some_table; 
     RETURN $1;  
END; 
$$ LANGUAGE plpgsql; 

Sonucu: n doğal sayı (1'den) nerede olduğunu otomatik oluşturulan adı gibi görünüyor

SELECT function_1('myowncursorname'); 
    function_1 
----------------- 
myowncursorname 
(1 row) 

, <unnamed portal n> olduğunu.

DÜZENLEME:

BEGIN; 
SELECT function_1(); 
SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table'; 
COMMIT; 

Sonuç:

Örneğin

SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table'; 

: Oluşturulan imleç adı almak için böyle bir sorgu ile pg_cursors görünümünü kullanabilirsiniz başka yol olarak

 function_1 
-------------------- 
<unnamed portal 3> 
(1 row) 

     name 
-------------------- 
<unnamed portal 3> 
(1 row) 
+0

Teşekkürler. Ancak problem 'function_1'ın diğer taraflarca sağlanmış olması ve bu fonksiyon için giriş parametrelerini değiştirememem. –

+0

Özel imleç adı sağlamanın tek yolu olduğunu düşünüyorum, ancak bununla% 100 emin değilim. –

+0

@Ken: imleç adının 'pg_cursors' sistem kataloğundan (yukarıdaki gibi) alınmasından ne haber? –

12

bu geçerli Postgre'nin wich versiyonundan oldukça emin değilim (8.4'te geçerli olduğunu) ama böyle, ilan imleç adını tanımlamak için oldukça kolay bulundu:

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$ 
DECLARE 
     ref_cursor REFCURSOR := 'mycursor'; 
BEGIN 
     OPEN ref_cursor FOR SELECT * FROM some_table; 
     RETURN (ref_cursor);  
END; 
$$ LANGUAGE plpgsql; 

Ve o zaman böyle alabilirsiniz: Bu yöntem daha az külfetli bulmak

BEGIN; 
SELECT function_1(); 
FETCH 4 from mycursor; 
COMMIT; 

. Umarım yardımcı olur.

+2

adını almak için' pg_cursors'ın en son 'creation_time'ını kullanıyorum. 8.3.12'de de mevcuttur. – Nenad