sql >> Databasteknik >  >> RDS >> PostgreSQL

Kör fil med SQLExec som innehåller $$-tecken

$$ är bara ett minimum för dollarnotering . Gör det (mycket!) mindre sannolikt att det kommer i konflikt med strängar i den bifogade bokstaven genom att sätta en sträng mellan dollarn:


CREATE OR REPLACE FUNCTION time_to_sec(timepoint timestamp with time zone)
  RETURNS bigint LANGUAGE plpgsql AS
$BODY$
DECLARE
 seconds bigint;
 secondsFromEpoch bigint;
 secondsFromMidnight bigint;
BEGIN
 secondsFromEpoch = EXTRACT(EPOCH FROM timepoint)::bigint;
 secondsFromMidnight = EXTRACT(EPOCH FROM CURRENT_TIMESTAMP::date)::bigint;
 seconds = secondsFromEpoch - secondsFromMidnight;
 return seconds;
END;
$BODY$;

Fler råd

  • Tilldelningsoperatorn i plpgsql är := . = är odokumenterad och kan försvinna i framtida utgåvor. Mer under denna relaterade fråga .

  • Använd CURRENT_DATE istället för CURRENT_TIMESTAMP::date .

  • Det är tillåtet, men jag skulle råda dig att inte använda parameternamn med blandade skiftlägen i plpgsql. De är skiftlägesokänsliga.

  • Viktigast av allt, förenkla :

    CREATE OR REPLACE FUNCTION time_to_sec2(timepoint timestamp with time zone)
      RETURNS bigint LANGUAGE plpgsql STABLE AS
    $BODY$
    BEGIN
        RETURN EXTRACT(EPOCH FROM timepoint - current_date)::bigint;
    END;
    $BODY$;
    

    Eller till och med:

    CREATE OR REPLACE FUNCTION time_to_sec3(timepoint timestamp with time zone)
      RETURNS bigint LANGUAGE sql AS
    $BODY$
        SELECT EXTRACT(EPOCH FROM timepoint - current_date)::bigint;
    $BODY$;
    
  • Kan deklareras STABLE !

  • Det finns också den närbesläktade funktionen age() i PostgreSQL gör nästan, men inte riktigt, samma sak:det returnerar ett "symboliskt" resultat med standardår och månader. Därför uttryck med age() kan ge olika resultat under längre tidsperioder.

Dessa är alla likvärdiga - förutom att de två sista avviker med längre tidsperioder:

WITH x(t) AS (VALUES ('2012-07-20 03:51:26+02'::timestamptz))
SELECT time_to_sec(t)  AS t1
      ,time_to_sec2(t) AS t2
      ,time_to_sec3(t) AS t3
      ,EXTRACT(EPOCH FROM t - current_date)::bigint AS t4
      ,EXTRACT(EPOCH FROM age(t, current_date))::bigint AS t5 -- deviates
      ,EXTRACT(EPOCH FROM age(t))::bigint * -1  AS t6  -- deviates
FROM   x;

När det gäller den ursprungliga frågan:detta PostgreSQL-felmeddelande betyder inte nödvändigtvis att problemet ligger i dollartecknet:

För det mesta är det en saknad ; före den raden. Eller kanske ett icke-escapet specialtecken i XML, som < > & ? Dollartecknet $ borde bli bra. Men jag är ingen expert på myra. Det borde finnas mer sammanhang i PostgreSQL-loggen.




  1. Vad är det korrekta sättet att använda distinct på (Postgres) med SqlAlchemy?

  2. MySQL - Hur väljer man rader där värdet är i array?

  3. Kan jag använda kommandot \copy till en funktion av postgresql?

  4. Hur kan jag validera data före infogning/uppdatering med SQL Server?