sql >> Database teknologi >  >> RDS >> PostgreSQL

Udfør fil med SQLExec indeholdende $$ tegn

$$ er kun det absolutte minimum for notering i dollar . Gør det (meget!) mindre tilbøjelige til at komme i konflikt med strenge i den vedlagte bogstav ved at sætte en streng mellem dollars:


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$;

Flere råd

  • Tildelingsoperatoren i plpgsql er := . = er udokumenteret og kan forsvinde i fremtidige udgivelser. Mere under dette relaterede spørgsmål .

  • Brug CURRENT_DATE i stedet for CURRENT_TIMESTAMP::date .

  • Det er tilladt, men jeg vil fraråde at bruge parameternavne med blandede store og små bogstaver i plpgsql. Der skelnes mellem store og små bogstaver.

  • Vigtigst af alt, forenkle :

    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 endda:

    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 erklæres STABLE !

  • Der er også den nært beslægtede funktion age() i PostgreSQL gør næsten, men ikke helt, det samme:det returnerer et "symbolsk" resultat med standardår og måneder. Derfor udtryk med age() kan give forskellige resultater i længere perioder.

Disse er alle ækvivalente - bortset fra at de sidste to afviger med længere 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;

Med hensyn til det oprindelige spørgsmål:denne PostgreSQL-fejlmeddelelse betyder ikke nødvendigvis, at problemet er med dollartegnet:

Det meste af tiden er det en manglende ; før den linje. Eller måske et ikke-escaped specialtegn i XML, såsom < > & ? Dollartegnet $ burde være fint. Men jeg er ingen ekspert i myre. Der burde være mere kontekst i PostgreSQL-loggen.




  1. Hvad er den bedste praksis for primærnøgler i tabeller?

  2. få ud parameter fra mysql lagret procedure i java

  3. MariaDB JSON_ARRAYAGG() Forklaret

  4. Forespørgsel efter MySQL's INFORMATIONSSKEMA:Hvorfor? Hvordan?