Probleme mit Tabellen-/Spaltennamen als Variablen in Selects in pl/pgsql Funktion

Hallo ich habe eine Funktion

CREATE OR REPLACE FUNCTION ecf_combine_regions(text, int, int)
  RETURNS void 
VOLATILE SECURITY DEFINER
LANGUAGE plpgsql
AS '
 DECLARE

customregion ALIAS FOR $1;
snumber ALIAS FOR $2;
pnumber ALIAS FOR $3;

BEGIN

insert into ecf_region_scenario (wkb_geometry)
select customregion.wkb_geometry from customregion where customregion.p_id=pnumber and customregion.s_id=snumber
;
     RETURN;
 END';

Die ge-aliaste Variable customregion soll als Tabellenname in der Funktion übergeben werden.

Die eigentliche Funktion ist komplizierter deswegen muss ich die Kombination tabelle.spalte in dem Select verwenden.

Nun bekomme ich beim Ausführen der Funktion

select ecf_combine_regions(geo,1,1)

den Fehler "Column “geo” does not exist

obwohl doch geo alias customregion ein Tabellenname ist.

Wer kann mir helfen?
Muss ich da irgendetwas mit Single oder Doublequotes in dem Select statement in der Funktion drehen?

Du must dein SQL dynamisch als String basteln und diesen mit EXECUTE ausführen. So wie Du es gemacht hast geht es nicht.

Andreas

Ok. geändert, jetzt gibts schon beim Ausführen des create function statements eine Fehlermeldung: ERROR: syntax error at or near “insert”

CREATE OR REPLACE FUNCTION ecf_combine_regions(text, int, int)   RETURNS void  VOLATILE SECURITY DEFINER LANGUAGE plpgsql AS '  DECLARE  customregion ALIAS FOR $1; snumber ALIAS FOR $2; pnumber ALIAS FOR $3;  BEGIN
EXECUTE 'insert into ecf_region_scenario (wkb_geometry)

select '||customregion||'.wkb_geometry from '||customregion||' where '||customregion||'.p_id='||pnumber||' and '||customregion||'.s_id='||snumber
||'using customregion, snumber,pnumber';

     RETURN;
 END';

Entweder quotest Du im Body alles dreifach mit ’ oder verwendest Dollar-Quoting, was klar zu bevorzugen ist.

Andreas

Ok. Kannst du das mal beispielhaft anhand meines obigen codes darstellen, ich weis leider nicht wie du das genau meinst



test=*# create or replace function test() returns text as 'begin return ''bla''; end;'language plpgsql;
CREATE FUNCTION
test=*# select test();
 test
------
 bla
(1 row)

test=*# create or replace function test() returns text as $$begin return 'bla'; end;$$language plpgsql;
CREATE FUNCTION
test=*# select test();
 test
------
 bla
(1 row)

Du erkennst den Unterschied?


Andreas

Sorry ich kriegs nicht hin,kannst du so nett sein und das direkt in meinem Code umstellen… Danke!!

ok eins bin ich weiter jetzt bekomme ich Fehlermeldung " ERROR: cannot change name of input parameter “customregion”

Ok läuft durch jetzt aber ich bin wieder beim Fehlervom aller ersten Posting beim Ausführen der Funktion angekommen

Fehler "Column “geo” does not exist

obwohl doch geo alias customregion ein Tabellenname ist.

Dreck!

Ohne zu sehen, was du macht, ist es halt schwer, aber ein Tabellennamen ist was anderes als eine Spalte.


Andreas

ja deswegen komm ich auch nicht auf den trichter…die funktion ist eindeutig darufhin geschrieben, für customregion einen Tabellennamen einzusetzen…