<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Procedura składowana]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=625&amp;type=atom"/>
	<updated>2011-08-21T18:17:37Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=625</id>
		<entry>
			<title type="html"><![CDATA[Procedura składowana]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2640#p2640"/>
			<content type="html"><![CDATA[Witam

Nie wiem czy w PostgreSQL jest możliwe zrobienie takiej procedury jak np. w Oraclu,
która zwróci mi kilka pól typu Cursor (tak dla porównania z oraclem).

Więc stworzyłem sobie kilka własnych typów danych:

[code]
CREATE TYPE a1 AS
   (
    ...............
};
CREATE TYPE a2 AS
   (
    ...............
};
[/code]

Każda z powyższych typów ma własną procedurke ,która pobiera dane dla tych typów.

[code]
CREATE OR REPLACE FUNCTION "a1Proc"()
  RETURNS SETOF a1  AS ...............

CREATE OR REPLACE FUNCTION "a2Proc"()
  RETURNS SETOF a2  AS ...............
[/code]

Teraz zaczyna się sedno problemu.
Stworzyłem sobie typ ,które ma zawierać listę (tablice powyższych typów).
Tak bym mógł za pomocą jednej procedury pobrać to co pobierają a1Proc i a2Proc.

[code]
CREATE TYPE a1a2 AS
   (
    _a1 a1[],
    _a2 a2[]
};
[/code]

Teraz sama procedura , przy kompilacji jej nie ma błędów.
 

[code]
CREATE OR REPLACE FUNCTION sysbuk."a1a2 Proc"()
  RETURNS SETOF a1a2  AS
$BODY$
    DECLARE
        wynik a1a2;    
    BEGIN
                // wydaje mi sie ze te przypisanie jest ok
                SELECT ARRAY(SELECT * FROM "a1Proc"())INTO wynik._a1; 
                SELECT ARRAY(SELECT * FROM "a2Proc"())INTO wynik._a2;
                RETURN NEXT wynik;
    END
$BODY$
[/code]

Dopiera przy jej wywoływaniu występuje błąd.
[code]
ERROR:  subquery must return only one column
[/code]

Dla przykładu w Oraclu jest możliwość deklaracji zmiennych wyjściowych i wejściowych.
np.
_a1 OUT CURSOR,
_a2 OUT CURSOR,

Jednak w Postgresie chyba nie ma takiego mechanizmu dlatego wydaje mi się ,że jestem skazany na stworzenie 
dodatkowego typu a1a2.]]></content>
			<author>
				<name><![CDATA[Rogo]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1161</uri>
			</author>
			<updated>2011-08-21T18:17:37Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2640#p2640</id>
		</entry>
</feed>
