sql >> Databasteknik >  >> RDS >> PostgreSQL

PL/pgSQL för allt-i-ett dynamisk fråga

Kan du posta några tabelldefinitioner och ett exempel på vad du försöker göra? Jag är inte 100% säker på vad du är ute efter, men det finns ett par former av "dynamisk" SQL som använder lagrade procedurer/funktioner:

  1. Skapa en funktion som tar indataparametrar (d.v.s. kategoriTyp, styleId, eventName, areaId) och koppla in dessa värden till en "statisk" SQL-begäran. Här är ett exempel på frågekodavsnitt för ditt fall:

Här är ett riktigt exempel:

CREATE OR REPLACE FUNCTION SP_IGLGetItem(
    pItemId INTEGER
) 
RETURNS TABLE(
    ItemId INTEGER,
    ItemName VARCHAR(100),
    ItemCategory CHAR(2) 
AS
$$
BEGIN
    RETURN QUERY
    SELECT i.ItemId, i.ItemName, i.ItemCategory
    FROM Item i
    WHERE (i.ItemId = pItemId OR pItemId IS NULL) -- Return single item (if specified, otherwise return all)
    ;
END;
$$
LANGUAGE 'plpgsql';
  1. Bygg en sträng som innehåller den SQL du vill köra dynamiskt baserat på olika villkor, parametervärden etc. Detta är så dynamiskt du kan bli.

  2. Kör villkorligt olika "statiska" SQL-satser baserat på värdena för dina inmatningsparametrar.

Stämmer något av dessa med din situation?

PL/PGSQL är bara det språk som används för att skriva lagrade procedurer/funktioner i Postgres. Om du verkligen behöver dynamisk SQL-generering, är det bäst att skriva en funktion med PL/PGSQL.

Ett annat alternativ är att dynamiskt generera den SQL du vill ha i din klientapplikation och sedan bara skicka in den SQL direkt för att köras.



  1. Sammanfoga tabeller i MySql med ett gemensamt fält men olika värden för det gemensamma fältet

  2. MySQL Fulltext suffixsökning (booleskt läge) -(*apple)

  3. ORA-00257:arkiveringsfel. Anslut endast internt tills det frigörs.

  4. PostgreSQL, antal rader mellan min och max datum