sql >> Databáze >  >> RDS >> PostgreSQL

Spusťte soubor s SQLExec obsahující znaky $$

$$ je jen naprosté minimum pro kotace dolaru . Snižte (mnohem!) pravděpodobnost konfliktu s řetězci v přiloženém literálu vložením řetězce mezi dolary:


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

Další rady

  • Operátor přiřazení v plpgsql je := . = je nezdokumentovaný a v budoucích verzích může zmizet. Více v této související otázce .

  • Použijte CURRENT_DATE místo CURRENT_TIMESTAMP::date .

  • Je to povoleno, ale doporučoval bych nepoužívat smíšené názvy parametrů v plpgsql. Nerozlišují malá a velká písmena.

  • A co je nejdůležitější, zjednodušte :

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

    Nebo dokonce:

    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$;
    
  • Může být prohlášeno za STABLE !

  • Existuje také úzce související funkce age() v PostgreSQL dělá téměř, ale ne úplně totéž:vrací „symbolický“ výsledek se standardními roky a měsíci. Proto výraz pomocí age() může přinášet různé výsledky po delší dobu.

Všechny jsou ekvivalentní – kromě posledních dvou, které se liší delšími časovými úseky:

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;

Pokud jde o původní otázku:tato chybová zpráva PostgreSQL nemusí nutně znamenat, že problém je se znakem dolaru:

Většinou je to chybějící ; před tou čárou. Nebo možná speciální znaky bez speciálních znaků v XML, jako je < > & ? Znak dolaru $ mělo by to být v pořádku. Ale nejsem odborník na mravence. V protokolu PostgreSQL by mělo být více kontextu.




  1. Získání součtu několika sloupců ze dvou tabulek

  2. Regulární výraz Oracle odpovídá mezerám

  3. Proveďte MERGE na PostgreSQL 9.5

  4. java.lang.IllegalStateException:Pokus o provedení operace na uzavřené EntityManagerFactory