Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z funkcją
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
dado
Witam ma problem z z zrobienie funkcji w postgre a jestem w tym nowy. chodzi żeby funkcja mi zrwóciła wynik zapytania

  1. CREATE FUNCTION getArtnr(artnr text,text) RETURNS text AS $$
  2. SELECT DISTINCT(a.genartnr), c.bez AS genartnr_name, d.name AS producent
  3. FROM tecdoc_400c a
  4. JOIN tecdoc_320 b ON(a.genartnr=b.genartnr)
  5. JOIN tecdoc_030 c ON(b.beznr=c.beznr)
  6. JOIN ec_suppilers d ON(a.dlnr=d.dlnr)
  7. WHERE a.artnr='$1' AND a.kritnr IN(2,16)
  8. $$ LANGUAGE SQL;



wywala mi

  1. ERROR: RETURN type mismatch IN FUNCTION declared TO RETURN text
  2. DETAIL: Final SELECT must RETURN exactly one COLUMN.
  3. CONTEXT: SQL FUNCTION "getartnr"


może ktoś tu wie o co chodzi?
wookieb
Pisze ze funkcja musi zwracac tylko jedna kolumne.
Do twojego rozwiazania lepiej zastosowac widoki. W manualu znajdziesz informacje na ten temat
sowiq
Czytaj komunikat:
- ERROR: return type mismatch in function declared to return text = BŁĄD: niezgodność typów w zadeklarowanej funkcji, która ma zwracać tekst
- DETAIL: Final SELECT must return exactly one column. - SZEGÓŁY: końcowy SELECT musi zwracać dokładnie jedną kolumnę

Czyli deklarujesz, że chcesz zwrócić w funkcji tekst, a próbujesz zwrócić kilka kolumn.
dado
Hm to moja pierwsza funkcja w postgre więc mogę troche pobłądzić
dzięki za info już poprawiłem i funkcja tworzy się

  1. CREATE FUNCTION genartnr(artnr text, DATA anyarray) RETURNS anyarray AS $$
  2. SELECT DISTINCT(a.genartnr), c.bez AS genartnr_name, d.name AS producent
  3. FROM tecdoc_400c a
  4. JOIN tecdoc_320 b ON(a.genartnr=b.genartnr)
  5. JOIN tecdoc_030 c ON(b.beznr=c.beznr)
  6. JOIN ec_suppilers d ON(a.dlnr=d.dlnr)
  7. WHERE a.artnr='$1' AND a.kritnr IN(2,16)
  8. $$ LANGUAGE SQL;


Natomiast wstydnis.gif wstydnis.gif wstydnis.gif wstydnis.gif
Nie wiem do końca jak ją poprawnie wywołać

  1. SELECT genartnr('109');


mi wywala
  1. ERROR: FUNCTION genartnr("unknown") does NOT exist
  2. HINT: No FUNCTION matches the given name AND argument types. You may need TO ADD explicit type casts.
  3. SELECT genartnr('109');
wookieb
W postgresie poza nazwa funkcji rozroznia ja takze ilosc parametrow a takze ich typy wiec dla niego
Kod
FUNCTION genartnr(artnr text, data anyarray)

Kod
FUNCTION genartnr(artnr text)

Kod
FUNCTION genartnr(artnr bigint)

To rozne funkcje. Musisz dodać drugi parametr do jej wywołania
dado
Hm nie rozumiem tego.
Jak mam dodać drugi parametr wywołania

Tak?
  1. SELECT genartnr('109' text);



Wtedy wyskakuje mi błąd:
  1. ERROR: syntax error at OR near "text" at character 24


Chyba czegoś tu nie czaje (to moja 1 funkcja smile.gif )
wookieb
Cytat(dado @ 10.03.2009, 10:57:56 ) *
Jak mam dodać drugi parametr wywołania

Tak?
  1. SELECT genartnr('109' text);


Nie. Manual NIE gryzie http://www.postgresql.org/docs/8.3/interactive/plpgsql.html

A tak naprawde zastanowmy sie po co ci "data anyarray" skoro tego nie uzywasz w funkcji?
dado
Niestety ja nic nie czaje z manula sadsmiley02.gif
wookieb
A słowo pisane w języku polskim? A szczególnie moje drugie zdanie w ostatnim poście.
Moje drugie zdanie jest aliasem do słow "Wywal to z funkcji (definicji)"
dado
oka wstydnis.gif
wywaliłem data bo psu na bude ale dalej nie wiem jak to holerstwo wywołać sad.gif

teraz jest tak
  1. CREATE FUNCTION genartnr(artnr text, anyarray) RETURNS anyarray AS $$
  2. SELECT DISTINCT(a.genartnr), c.bez AS genartnr_name, d.name AS producent
  3. FROM tecdoc_400c a
  4. JOIN tecdoc_320 b ON(a.genartnr=b.genartnr)
  5. JOIN tecdoc_030 c ON(b.beznr=c.beznr)
  6. JOIN ec_suppilers d ON(a.dlnr=d.dlnr)
  7. WHERE a.artnr='$1' AND a.kritnr IN(2,16)
  8. $$ LANGUAGE SQL;
wookieb
Cytat
Moje drugie zdanie jest aliasem do słow "Wywal to z funkcji (definicji)"

A to tez jest aliasem do "wywal całkowicie drugi parametr ;("
dado
jak wywale annayrray to mi wywala
  1. Błąd SQL:
  2.  
  3. ERROR: cannot determine result DATA type
  4. DETAIL: A FUNCTION returning "anyarray" OR "anyelement" must have at least one argument of either type.
  5.  
  6. W poleceniu:
  7. CREATE FUNCTION genartnr(artnr text) RETURNS anyarray AS $$
  8. SELECT DISTINCT(a.genartnr), c.bez AS genartnr_name, d.name AS producent
  9. FROM tecdoc_400c a
  10. JOIN tecdoc_320 b ON(a.genartnr=b.genartnr)
  11. JOIN tecdoc_030 c ON(b.beznr=c.beznr)
  12. JOIN ec_suppilers d ON(a.dlnr=d.dlnr)
  13. WHERE a.artnr='$1' AND a.kritnr IN(2,16)
  14. $$ LANGUAGE SQL;
sadsmiley02.gif
wookieb
Zamien anyarray na record
SongoQ
  1. CREATE TYPE type1 AS (
  2. a1 integer,
  3. b1 varchar,
  4. c1 varchar
  5. );
  6.  
  7. CREATE FUNCTION genartnr(artnr text) RETURNS type1 AS $
  8. SELECT DISTINCT(a.genartnr) AS a1, c.bez AS b1, d.name AS c1
  9. FROM tecdoc_400c a
  10. JOIN tecdoc_320 b ON(a.genartnr=b.genartnr)
  11. JOIN tecdoc_030 c ON(b.beznr=c.beznr)
  12. JOIN ec_suppilers d ON(a.dlnr=d.dlnr)
  13. WHERE a.artnr = $1 AND a.kritnr IN (2,16);
  14. $ LANGUAGE SQL;
  15.  
  16. SELECT * FROM genartnr( 'nie potrafie czytac manual' );
dado
Dziękuje za odpowiedzi, te mniej lub bardziej uszczypliwe smile.gif.
Funkcja w końcu zahulała smile.gif
Natomiast zwraca zawsze 1 rekord a potrzeba co by zwracała wszystkie znalazłem cos na temat kursorów w ciele funkcji tutaj
http://www.dbf.pl/faq/tresc.html?rozdzial=10#o10_20
punkt: 10.20

Czy to ten kierunek? Czy dalej błądzę?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.