Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wypełnianie typu rowtype
viking
post 7.02.2014, 15:53:47
Post #1





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


  1. CREATE OR REPLACE FUNCTION x()
  2. RETURNS setof "faktury" AS
  3. $BODY$
  4. DECLARE
  5. outdated_invoices "faktury"%ROWTYPE;
  6.  
  7. BEGIN
  8. FOR outdated_invoices IN
  9. SELECT ff.id_faktury, ff.id_transakcji, ff.numer_faktury
  10. FROM "faktury" ff
  11. WHERE ff.data_wplaty IS NULL
  12. AND ff.data_wystawienia_fv + interval '7 days' < CURRENT_DATE
  13. loop
  14. RETURN next outdated_invoices;
  15. end loop;
  16. RETURN;
  17. END;


Struktura tej tabeli jest id_faktury|id_firmy|inne_id|...|numer_faktury

Wytłumaczcie mi proszę dlaczego postgres dla zapytania select * x(); zamiast podstawić odpowiednie kolumny do ROWTYPE wciska je po kolei według selecta? Czyli zamiast wypełnić na przykład:
Kod
id_faktury|null|null|...|numer_faktury

wstawia zwyczajnie
Kod
id_faktury|id_transakcji|numer_faktury

Czyli w tym wypadku numer_faktury trafia do kolumny integer inne_id.

Może to piątek sprawia że już głupoty wypisuję? smile.gif


--------------------
Go to the top of the page
+Quote Post
phpion
post 12.02.2014, 09:05:34
Post #2





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Pewnie dlatego, że pobierasz tylko wybrane kolumny. Musiałbyś pobrać wszystkie kolumny by prawidłowo wypełnić rekord typu "faktury". Wiąże się to zapewne z tym, że Postgres po kolei wypełnia napotkane kolumny. Dlaczego nie opiera się na ich nazwach? Pewnie dlatego, że w przypadku aliasów wypełnienie nie byłoby możliwe. Więc ignoruje nazwy kolumn i wstawia dane po kolei.
Go to the top of the page
+Quote Post
viking
post 19.02.2014, 14:50:34
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Masz rację. Znalazłem w międzyczasie gdzieś informację że postgres indeksy traktuje numerycznie, nie używając nazw kolumn. Moim zdaniem trochę to słabe, przede wszystkim przeczy zasadzie spójności jeżeli w międzyczasie zmieni się struktura tabeli. Wolałbym wywalenie błędu w przypadku niezgodności. A przecież w końcu po to definiuję konkretną tabelę zamiast losowego typu RECORD żeby nie mieć takich kwiatków.


--------------------
Go to the top of the page
+Quote Post
phpion
post 20.02.2014, 14:20:02
Post #4





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




O spójność się nie martw. Dokładając nowe pole do tabeli jest ono umieszczane na końcu tabeli. W Postgresie nie masz możliwości ustalania na jakiej pozycji zostanie wstawiona nowa kolumna. Mnie to czasem irytuje bo lubię mieć porządek (nawet w kolejności kolumn) wink.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 03:16