sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql försöker använda exekveringsformat i en funktion men får felet kolumn hittades inte när man ger strängformat i sammansmältning

Detta kan göra vad du letar efter:

CREATE OR REPLACE FUNCTION foo(_t text)
  RETURNS TABLE (Stage_ID bigint, Date varchar) AS
$func$
   SELECT t.Stage_ID, t.Date
   FROM   tbl t
   WHERE  t.Date = _t::date;
$func$  LANGUAGE sql;
  • Uttrycket where to_date(Date, "YYYY-MM-DD")==%I',_t); är baklänges på flera sätt.

    • Enstaka citattecken för värden :'YYYY-MM-DD' .
    • Operatorn är = , inte == .
    • Det verkar som om du verkligen vill ha t.Date = to_date(_t, 'YYYY-MM-DD')
    • Och medan _t är i standard ISO-format 'ÅÅÅÅ-MM-DD', hellre bara casta istället:t.Date = _t::date .
  • Utdatakolumnnamn är synliga inuti funktionskroppen. Tabellkvalificerad kolumn med samma namn. Ännu bättre, undvik att namnge sådana konflikter till att börja med! Se:

  • Inget behov av dynamisk SQL med EXECUTE . Att skicka ett datavärde fungerar bara fint med vanlig SQL.

  • Inget behov av plpgsql. Den enkla frågan kräver ingen procedurfunktionalitet. LANGUAGE sql gör jobbet - om du behöver en funktion överhuvudtaget skulle vanlig SQL verka bra för jobbet.

Bortsett från:använd inte grundläggande typnamn som "datum" som identifierare. Håll dig till lagliga, gemener identifierare. Relaterat:




  1. SQL Server-isoleringsnivåer:A-serien

  2. Returnera främmande nyckel med DQL-fråga

  3. ORA-01403:ingen data hittades för Välj till

  4. Databasdesign - primära nyckelnamnskonventioner