Trigger TO_CHAR

Hallo,

ich bin gerade dabei das hr Schema von Oracle für PostgreSQL 8.1 nutzbar zu machen. Leider habe ich leichte Probleme mit der Ertellung von Functions.

original Oracle Function

CREATE OR REPLACE PROCEDURE secure_dml
IS
BEGIN
IF TO_CHAR (SYSDATE, ‘HH24:MI’) NOT BETWEEN ‘08:00’ AND ‘18:00’
OR TO_CHAR (SYSDATE, ‘DY’) IN (‘SAT’, ‘SUN’) THEN
RAISE_APPLICATION_ERROR (-20205,
‘You may only make changes during normal office hours’);
END IF;
END secure_dml;
/

CREATE OR REPLACE TRIGGER secure_employees
BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
secure_dml;
END secure_employees;
/



meine PL/PGSQL Variante

CREATE OR REPLACE FUNCTION secure_dml() RETURNS trigger AS ’
BEGIN
IF TO_CHAR(current_timestamp,‘HH24:MI’) NOT BETWEEN ‘08:00’ AND ‘18:00’
OR TO_CHAR (current_timestamp, ‘DY’) IN (‘SAT’, ‘SUN’)
THEN
RAISE EXCEPTION ‘‘You may only make changes during normal office hours.’’;
END IF;
END;
’ LANGUAGE plpgsql;

Wenn ich im psql die SQL Datei lade erhalte ich folgende Fehlermeldung.
ERROR: syntax error at or near “HH24” at character 101

Ich dachte das ich einen Fehler beim Aufruf der Funktion TO_CHAR gemacht habe. Aber das habe ich nicht da der Aufruf SELECT TO_CHAR(current_timestamp,‘HH24:MI’) eine korrekte Ausgabe bringt.


Danke schon einmal im Vorraus für eure Hilfe!

ciao
Andreas

Hallo Andreas,

http://www.postgresql.org/docs/books/pghandbuch.html.de, Kapitel 38.2 “Umgang mit Apostrophen”



Es gibt eine einfachere Lösung:

CREATE OR REPLACE FUNCTION secure_dml() 
RETURNS trigger

AS $BODY$

  BEGIN
    IF TO_CHAR(current_timestamp,'HH24:MI') NOT BETWEEN '08:00' AND '18:00'
      OR TO_CHAR (current_timestamp, 'DY') IN ('SAT', 'SUN') 
      THEN
        RAISE EXCEPTION 'You may only make changes during normal office hours.';
      END IF;
  END;

$BODY$

LANGUAGE plpgsql;

mfg

fristo

Hallo fristo,

danke für die schnelle und kompetente Hilfe!

mfg
Andreas