Portál AbcLinuxu, 14. srpna 2025 11:16


Dotaz: plpgsql a execute

11.5.2005 16:36 stradivarius
plpgsql a execute
Přečteno: 147×
Odpovědět | Admin
ahoj, potreboval bych zmenit zaznam v tabulce pomoci funkce v plpgsql. UPDATE je sestavovan v cyklu FOR a vypada takto:

EXECUTE ''UPDATE nodes_wgs set ycoord_float = '' || y || '' WHERE gid = '' || zaznam.gid || '';'';

prikaz se jakoby provadi, ale nic se neupdatne. Kdyz si dam stejny retezec vypisovat na obrazovku, je v poradku, napr.: UPDATE nodes_wgs set ycoord_float = 50.0675771 WHERE gid = 6002;

nesetkali jste se nekdo s timhle problemem? Asi to bude nejaka hloupost.. Dik
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.5.2005 17:26 eXEden | skóre: 13 | blog: Plkoviny | Praha
Rozbalit Rozbalit vše Re: plpgsql a execute
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevim sice, jak to volas, ale nechybi tam nekde commit?
11.5.2005 23:43 stradivarius
Rozbalit Rozbalit vše Re: plpgsql a execute
ahoj, nemam transakci. je to normalni UDF v Pl/PgSQL, kterou volam z shellu psql. Jde o to, aby se ten update udelal rychle. Kdyz toto napisu v bashi tak je to na dva dny, protoze dat je moc. Souradnice mam 10000000x vetsi nez je wgs84 (napr. misto 15.12345 mam 151234560) a chci je tedy vlozit do noveho sloupce xcoord_float ve spravne velikosti. Funkce vypada tak:

CREATE FUNCTION preved_wgs() RETURNS void AS '

DECLARE

zaznam nodes_wgs%ROWTYPE;

x nodes_wgs.xcoord_float%TYPE;

querytext1 varchar(100);

BEGIN

FOR zaznam IN SELECT * from nodes_wgs LOOP

x := zaznam.xcoord / 10000000.0;

EXECUTE ''UPDATE nodes_wgs set xcoord_float = '' || x || '' WHERE gid = '' || zaznam.gid || '';'';

querytext1 := ''UPDATE nodes_wgs set xcoord_float = '' || x || '' WHERE gid = '' || zaznam.gid || '';'';

UPDATE nodes_wgs SET xcoord_float = x WHERE gid = zaznam.gid;

RAISE INFO ''querytext1 is %'', querytext1;

END LOOP;

RETURN "";

END'

LANGUAGE 'plpgsql';

pri spusteni funkce to normalne vypisuje, co ma, tzn spoustu dat:-) UPDATE, ktery si nechavam vypisovat jako info mi funguje, kdyz ho zkopiruju do psql. Ale ten EXECUTE se proste neprovede.. Ten vypis:

INFO: updating gid no. 9080

INFO: querytext1 is UPDATE nodes_wgs set xcoord_float = 14.4307393 WHERE gid = 9080;

.

.

.

atd. sorry za hnusny format ale na "html znacky" dnes nejak nemam chut:-)
12.5.2005 06:44 Pavel 'lingeek' Szalbot | skóre: 54 | Třinec
Rozbalit Rozbalit vše Re: plpgsql a execute
Řekl bych, že místo tvého EXECUTE "UPDATE .....

PREPARE plan (BIGINT, BIGINT) AS UPDATE nodes_wgs set xcoord_float = $1 WHERE gid = $2; EXECUTE plan (x, zaznam.gid);

-> Chybí mi tam PREPARE, které v téhle situaci stejně postrádá smysl, pokud ovšem daný "plán" neprovádíš častěji-

BTW. dal bych si pozor na převody, ale o tom asi víš.
Math, as Barbie says, is hard.
12.5.2005 16:32 stradivarius
Rozbalit Rozbalit vše Re: plpgsql a execute
Ahoj, dik za tip, nicmene EXECUTE v plpgsql ma jiny vyznam nez v SQL, aspon tak chapu manual http://www.postgresql.org/docs/7.4/interactive/plpgsql-statements.html

Bohuzel se mi to nepovedlo vyresit tak, jak jsem chtel - uz jsem nemel cas to resit, tak jsem to provedl jednim priisernym hackem, se kterym se nebudu ani chlubit. Rekl bych ze problem byl v prevodech, jak pises. Mam pocit, jako by EXECUTE v plpgsql nedavalo hlasky o chybach a varovani. Presto by me to zajimalo, dynamicke query v UDF budu jeste do budoucna resit. Pokud byste tedy nekdo vedel, kde jsem mel chybu? Dik
13.5.2005 08:58 Pavel 'lingeek' Szalbot | skóre: 54 | Třinec
Rozbalit Rozbalit vše Re: plpgsql a execute
Máš pravdu... EXECUTE mi chybové hlášky vypisuje, tak zkus ještě SET client_min_messages=INFO;

Chyba bude asi opravdu v těch převodech (zkus typ bigint, ale vidím, že budeš potřebovat spíše numeric) - kód mi přijde v pořádku, ale ... Pokud dobře vidím, tak jen updatuješ celou tabulku nodes_wgs a konkrétně jen přenastavuješ xcoord_float na jinou hodnotu. To se dá dobře udělat příkazem: UPDATE nodes_wgs SET xcoord_float=xcoord*10000000.0. Nebo mi zase něco uteklo? Btw. ten update bude stejně pomalý (a s typem numeric ještě pomalejší).
Math, as Barbie says, is hard.
16.5.2005 11:04 stradivarius
Rozbalit Rozbalit vše Re: plpgsql a execute
To se dá dobře udělat příkazem: UPDATE nodes_wgs SET xcoord_float=xcoord*10000000.0.
mas pravdu:-), ale za tim pak jeste nasledovalo vlozeni bodu POINT v postgisu, ktere bohuzel nejde takto a navic setavovani retezce query budu potrebovat dale. Vyresil jsem to nakonec jinak:

CREATE OR REPLACE FUNCTION preved_point(integer, float, float) RETURNS void AS '

DECLARE

ide integer;

x float;

y float;

BEGIN

ide := $1;

x := $2;

y := $3;

UPDATE nodes_wgs SET nodes_geom = Geomfromtext((''POINT('' || x ||'' '' || y || '')'' ), 4326) WHERE gid = ide;

RETURN;

END

' LANGUAGE PLPGSQL;

a potom samozrejme:

select preved_point(gid, xcoord_float, ycoord_float) from nodes_wgs;

Co se tyce rychlosti, bylo to do dvou minut (96000 zaznamu, PIII+256RAM). Sestavoveni dotazu, tak jak jsem uvedl v prvnim prispevku, jsem bohuzel nerozchodil. Zdravim

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.