45 votes

ERREUR : chaîne citée non terminée à ou près de

En exécutant le code de déclenchement ci-dessous à l'aide de ANT, j'obtiens l'erreur suivante

org.postgresql.util.PSQLException: ERROR: unterminated quoted string at or near "' DECLARE timeout integer"
Position: 57

Je suis en mesure d'exécuter avec succès le code ci-dessous via PGADmin (fourni par postgres) et l'utilitaire de ligne de commande "psql" et la fonction de déclenchement est ajoutée, mais lors de l'exécution via ANT, il échoue à chaque fois.

BEGIN TRANSACTION;

CREATE OR REPLACE FUNCTION sweeper() RETURNS trigger as '
    DECLARE
    timeout integer;
    BEGIN
    timeout = 30 * 24 * 60 * 60 ;
        DELETE FROM diagnosticdata WHERE current_timestamp - teststarttime  > (timeout * ''1 sec''::interval);
        return NEW;
    END;
' LANGUAGE 'plpgsql';

-- Trigger: sweep on diagnosticdata

CREATE TRIGGER sweep
  AFTER INSERT
  ON diagnosticdata
  FOR EACH ROW
  EXECUTE PROCEDURE sweeper();

END;

1voto

David Points 11

Cet exemple a fonctionné pour moi avec PostgreSQL 14.1 et HeidiSQL 9.4.0.5125

DROP TABLE IF EXISTS emp;
CREATE TABLE emp (
    empname           text NOT NULL,
    salary            integer
);

DROP TABLE IF EXISTS EMP_AUDIT;
CREATE TABLE emp_audit(
    operation         char(1)   NOT NULL,
    stamp             timestamp NOT NULL,
    userid            text      NOT NULL,
    empname           text      NOT NULL,
    salary integer
);

DELIMITER //
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $$
    BEGIN
        --
        -- Create a row in emp_audit to reflect the operation performed on emp,
        -- make use of the special variable TG_OP to work out the operation.
        --
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
            RETURN NEW;
        END IF;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS emp_audit ON emp;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();

1voto

fvel Points 18

J'ai eu le même problème avec zeos et c++ builder. La solution dans mon cas :
Remplacez le délimiteur de propriété (généralement " ;") par un autre dans le composant (classe) que j'ai utilisé.

dm->ZSQLProcessor1->DelimiterType=sdGo;

Peut-être que Ant a quelque chose de similaire.

0voto

masoodg Points 461

Je recevais la même erreur parce que j'avais mis mon point-virgule dans une nouvelle ligne comme ceci :

WHERE colA is NULL
;

Assurez-vous qu'ils sont sur une seule ligne comme

WHERE colA is NULL;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X