1

Temat: Zapytanie o kolumny ?

Jak uruchamiam, tą funkcję to wszystko dobrze chodzi.
Jeśli jawnie wypisze kolumny, to wyskakuje mi błąd. -- w kome.
Błąd : return type mismatch in function declared to return osoby

CREATE  FUNCTION p() RETURNS
setof osoby
AS
$$
SELECT * FROM osoby   -- Select imie, nazwisko From osoby
$$
LANGUAGE 'sql';
SELECT * FROM p();      -- Select imie, nazwisko From p()


Jeszcze mam pytanie o funkcje agregujące, czyli takie jak count(), sum(), max().
Jak uruchamiam  je w podstawowej składni SQL to się wykonują, a jeśli umieszczam je w procedurze to wyskakuje mi błąd.

2

Odp: Zapytanie o kolumny ?

czy tabela osoby sklada sie tylko z kolumn imie,nazwisko?
W jaki sposób uzywsz funckji agregujacych? podaj jakis przyklad w ktorym wyskakuje ci blad?

3

Odp: Zapytanie o kolumny ?

Tabela osoby składa się z 7 kolumn. Kolumna imie i nazwisko są typu char, reszta numeric.
Chyba problem tkwi w typach kolumn i braku deklaracji?
Final SELECT returns character varying instead of numeric at column 1.

4

Odp: Zapytanie o kolumny ?

Jeżeli tabela osoby ma 7 kolumn robisz funkcje

CREATE  FUNCTION p() RETURNS
setof osoby 

to nie mozesz w tej funkcji wpisac

select imie,nazwisko

bo "setof osoby" oznacza zbiór wierszy z tabeli osoby obejmujący wszystkie kolumny.
Ale jeśli mam rację i dobrze opisales swoj problem to komunikat bladu powinien byc w stylu

ERROR:  return type mismatch in function declared to return ...
SZCZEGÓŁY: Final SELECT returns too few columns.
KONTEKST:  SQL function "..."

Ostatnio edytowany przez rski (2009-04-21 12:25:44)

5

Odp: Zapytanie o kolumny ?

Funkcja agregująca ma za zadanie zliczyć wszystkie wiersze w tabeli osoby.

CREATE FUNCTION ex1() RETURNS integer AS
$$
select count(*)  from osoby
$$LANGUAGE 'sql';

BŁĄD: return type mismatch in function declared to return integer
Stan SQL:42P13
Szczegóły:Aktualny zwracany typ to bigint.
Kontekst:funkcja SQL "ex1"

Jak rozwiązać te problemy ?

-- Jak robię zapytanie, po kolumnie to wynik dostaję.

CREATE OR REPLACE FUNCTION ex2()
RETURNS numeric AS $$
select sum(brutto)  from zarobki
$$LANGUAGE 'sql';

SELECT * from ex2()

Ostatnio edytowany przez woziu (2009-04-21 17:27:01)

6

Odp: Zapytanie o kolumny ?

Może zamiast

CREATE FUNCTION ex1() RETURNS integer AS 

zwracaj bigint

CREATE FUNCTION ex1() RETURNS bigint AS 

Jak podpowiada komunikat błędu

7

Odp: Zapytanie o kolumny ?

CREATE FUNCTION ex14() RETURNS  CHARACTER AS
$$

select nazwisko,imie, opis  from nagrody, osoby where nagrody.opis = 'I Nagroda' AND osoby.idosoby = nagrody.idosoby; ;
$$LANGUAGE 'sql';
select * from ex14();

BŁĄD:  return type mismatch in function declared to return character
SZCZEGӣY: Final SELECT must return exactly one column.
KONTEKST:  funkcja SQL "ex14"

Dzisiaj przeczytałem komunikat:) Zrobiłem jedną kolumnę w Select, udało się.
select nazwisko  from nagrody, osoby  where nagrody.opis = 'I Nagroda' AND osoby.idosoby = nagrody.idosoby; ;
Jak zrobić, aby w wyniku funkcji zobaczyć trzy kolumny.
Nazwisko, imie, opis są tego samego typu.

8

Odp: Zapytanie o kolumny ?

Możesz tak

CREATE FUNCTION ex14() RETURNS  SETOF RECORD AS
$$

select nazwisko,imie, opis  from nagrody, osoby where nagrody.opis = 'I Nagroda' AND osoby.idosoby = nagrody.idosoby; ;
$$LANGUAGE 'sql';

Ale wywołanie jest trochę bardziej skomplikowane

select * from ex14() t(nazwisko typ_kolumny_nazwisko, imie typ_kolumny_imie, opis typ_kolumny_opis); 

bo dla zwracanego typu record musisz powiedzieć postgresowi podczas co ma wyświetlić. Nazwa t jest tu dowolna w dokumentacji pewnie znajdziesz cos w stylu 'foo' w nawiasach t( ) podajesz cos chcesz z rekordu wyswietlic

Możesz też pokombinować z parametrami OUT funkcji, ewentualnie stworzyć typ recordowy z trzema polami i zwrócić go w funkcji (zamiast 'return setof record')

9

Odp: Zapytanie o kolumny ?

Dokładnie o to mi chodziło, dziękuje smile