Trigger TO_CHAR

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
ap0477
Neuer Benutzer
Beiträge: 6
Registriert: Sa 14. Jan 2006, 15:50
Wohnort: Erfurt
Kontaktdaten:

Trigger TO_CHAR

Beitrag von ap0477 »

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

fristo
Erfahrener Benutzer
Beiträge: 670
Registriert: Do 8. Dez 2005, 12:30
Wohnort: Raum Frankfurt/Main

Re: Trigger TO_CHAR

Beitrag von fristo »

Hallo Andreas,

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



Es gibt eine einfachere Lösung:

Code: Alles auswählen

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

ap0477
Neuer Benutzer
Beiträge: 6
Registriert: Sa 14. Jan 2006, 15:50
Wohnort: Erfurt
Kontaktdaten:

Beitrag von ap0477 »

Hallo fristo,

danke für die schnelle und kompetente Hilfe!

mfg
Andreas

Antworten