Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z funkcją
dado
post
Post #1





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


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?
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Pisze ze funkcja musi zwracac tylko jedna kolumne.
Do twojego rozwiazania lepiej zastosowac widoki. W manualu znajdziesz informacje na ten temat
Go to the top of the page
+Quote Post
sowiq
post
Post #3





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
dado
post
Post #4





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif) (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif) (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif) (IMG:http://forum.php.pl/style_emoticons/default/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');
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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

Ten post edytował wookieb 6.03.2009, 13:09:04
Go to the top of the page
+Quote Post
dado
post
Post #6





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )
Go to the top of the page
+Quote Post
wookieb
post
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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?

Ten post edytował wookieb 10.03.2009, 11:04:52
Go to the top of the page
+Quote Post
dado
post
Post #8





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


Niestety ja nic nie czaje z manula (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)
Go to the top of the page
+Quote Post
wookieb
post
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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)"

Ten post edytował wookieb 10.03.2009, 11:39:52
Go to the top of the page
+Quote Post
dado
post
Post #10





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


oka (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif)
wywaliłem data bo psu na bude ale dalej nie wiem jak to holerstwo wywołać (IMG:http://forum.php.pl/style_emoticons/default/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;
Go to the top of the page
+Quote Post
wookieb
post
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 ;("
Go to the top of the page
+Quote Post
dado
post
Post #12





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


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;
(IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)
Go to the top of the page
+Quote Post
wookieb
post
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Zamien anyarray na record
Go to the top of the page
+Quote Post
SongoQ
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


  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' );


Ten post edytował SongoQ 10.03.2009, 13:22:33
Go to the top of the page
+Quote Post
dado
post
Post #15





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


Dziękuje za odpowiedzi, te mniej lub bardziej uszczypliwe (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Funkcja w końcu zahulała (IMG:http://forum.php.pl/style_emoticons/default/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ę?
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 13:14