Aufrufen von PostgreSQL-Prozeduren oder -Funktionen über den Query Builder von QGIS

Oct 18 2020

Ich versuche, entweder eine in der PostgreSQL / PostGIS-Datenbank definierte gespeicherte Prozedur oder Funktion aufzurufen und vom QGIS Query Builder aus zu verwenden. Weder Arbeit:

  • Die Funktion gibt eine Tabelle zurück, die vom Query Builder nicht interpretiert werden kann
  • Die Prozedur, die eine Auswahl zurückgibt, schlägt fehl, wenn ich sie mit der callAnweisung aufrufe

Beide funktionieren gut in DataGrip und fragen ein Tag aus einer Textarray tag-Spalte in der waypointsTabelle ab.

Hier ist die Funktion:

create or replace function gwd(t text)
RETURNS TABLE (f_ogc_fid int, f_name text)
LANGUAGE plpgsql
AS $$ BEGIN return query SELECT ogc_fid,name::text FROM gis.gps.waypoints where tag @> STRING_TO_ARRAY(t, ','); end; $$

Hier ist die Prozedur, die CALLim Query Builder von QGIS fehlschlägt :

create or replace procedure grw(T text)
LANGUAGE plpgsql
AS $$ BEGIN SELECT * FROM gis.gps.waypoints where tag @> STRING_TO_ARRAY(T, ','); end; $$

Hier ist der Fehler, den QGis bei der Ausführung call grw('iron')im Query Builder gemeldet hat :

An error occurred when executing the query.
The data provider said:
ERROR:  syntax error at or near "grw"
LINE 1: SELECT * FROM "gps"."waypoints" WHERE call grw('iron') LIMIT...

Wenn ich es ohne das nenne CALL, funktioniert es auch nicht:

An error occurred when executing the query.
The data provider said:
ERROR:  grw(unknown) is a procedure
LINE 1: SELECT * FROM "gps"."waypoints" WHERE grw('iron') LIMIT 0
HINT:  To call a procedure, use CALL.

Antworten

1 geozelot Oct 19 2020 at 09:56

Drei Dinge:

  • A PRODECUREist eine transaktionsbewusste prozedurale Anweisung , die in PG 11 eingeführt wurde, um die fehlende Transaktionssteuerung in einem normalen FUNCTIONBlock aufzunehmen.

    Allerdings , ein PROCEDURE nicht Werte zurück , und alles andere als direkt mit (Aufruf nichts anderes als )

    CALL <procedure>;
    

    kann nicht arbeiten. Sie möchten a verwenden, PROCEDUREwenn Sie DDL-Anweisungen für Ihre Beziehungen zur Transaktionssteuerung ausführen möchten , während Sie Fehler während der Ausführung eleganter behandeln. Semantisch suchen Sie nach aFUNCTION

  • Im Dialogfeld " Abfrage- Generator" können Sie schnell Filterausdrücke zur Datenquelle hinzufügen.

    QGIS übersetzt diese Filter jedoch in eine anbieterspezifische Syntax. Dies bedeutet, dass im Fall einer PostgreSQL / PostGIS-Quellschicht diese Anweisungen einer Basisabfrage in Form von hinzugefügt werden

    SELECT * FROM "<schema>"."<table>" WHERE <FILTER>;
    

    Wo <FILTER>ist der genaue Ausdruck, der in das Dialogfeld eingegeben wird?

  • In jedem Fall sind Ihre Versuche für die Art und Weise, wie Sie sie verwenden möchten, sinnlos (keine Beleidigung):

    • Es ist nicht sinnvoll, eine Tabelle nach einem Tag zu filtern, um die zurückgegebenen Zeilen / Werte als denselben Filter für dieselbe Tabelle zu verwenden
    • und wenn man will , das tun, müssen Sie wieder einen Filterausdruck definieren zu verwenden , die zurückgegebenen Zeilen / Werte

Die einfachste Lösung wäre, einfach ( und nur ) einzutreten

'iron' = ANY(tag)

in das Ausdrucksfeld des Abfrage-Generators ; das übersetzt in

SELECT * FROM "gps"."waypoints" WHERE 'iron' = ANY(tag);

die Sie bei Bedarf direkt in SQL verwenden können.