Aufrufen von PostgreSQL-Prozeduren oder -Funktionen über den Query Builder von QGIS
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
Drei Dinge:
A
PRODECUREist eine transaktionsbewusste prozedurale Anweisung , die in PG 11 eingeführt wurde, um die fehlende Transaktionssteuerung in einem normalenFUNCTIONBlock aufzunehmen.Allerdings , ein
PROCEDUREnicht 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 aFUNCTIONIm 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.