État SQL: 42601 erreur de syntaxe sur ou près de “11”
J'ai une table address_all
et elle est héritée par plusieurs tables d'adresse. address_history
hérite de table parent history_all
et tient à jour les informations d'adresse. Je suis entrain de créer une nouvelle table qui hérite address_all
table et des copies de l'information à partir de address_history
à la nouvelle table.
Ma procédure stockée est comme ci-dessous. J'ai des erreurs quand je l'appelle. Pour mieux expliquer l'erreur, je suis en utilisant le numéro de ligne.
1 CREATE OR REPLACE FUNCTION somefunc()
2 RETURNS void AS
3 $BODY$
4 DECLARE
5 year_id INTEGER;
6 month_id INTEGER;
7 week_id INTEGER;
8 addresstablename text;
9 backupdays text;
10 BEGIN
11 week_id := EXTRACT(DAY FROM TIMESTAMP 'now()');
12 month_id := EXTRACT(MONTH FROM TIMESTAMP 'now()');
13 year_id := EXTRACT(YEAR FROM TIMESTAMP 'now()');
14 addresstablename := 'address_history_' || week_id || '_' || month_id || '_' || year_id;
15 backupdays:= date_trunc('hour',CURRENT_TIMESTAMP - interval '7 days');
16 EXECUTE 'create table ' || addresstablename || '() INHERITS (address_all)';
17 EXECUTE 'insert into ' || addresstablename || ' select * from address_history where address_timestamp >= ' || backupdays || ''; --AS timestamp without time zone);
18 END;
19 $BODY$
20 LANGUAGE 'plpgsql' VOLATILE;
Quand je le lance:
select somefunc()
J'obtiens cette erreur:
ERROR: syntax error at or near "12"
LINE 1: ...story where address_timestamp >= 2012-07-31 12:00:00-0...
^
QUERY: insert into address_history_7_8_2012 select * from address_history where address_timestamp >= 2012-07-31 12:00:00-04
CONTEXT: PL/pgSQL function "somefunc" line 14 at EXECUTE statement
********** Error **********
ERROR: syntax error at or near "12"
SQL state: 42601
Context: PL/pgSQL function "somefunc" line 14 at EXECUTE statement
Vous devez vous connecter pour publier un commentaire.
Essayer ce en grande partie une forme simplifiée:
Les points principaux:
Vous pouvez attribuer des variables en plpgsql au moment de la déclaration. Simplifie le code.
Utilisation
to_char()
au format de votre date. Beaucoup plus simple.now()
etCURRENT_TIMESTAMP
faire de même.Ne pas citer
'now()'
, utiliseznow()
(sans les guillemets) si vous voulez le timestamp actuel.Utiliser le
à l'AIDE de
clauseEXECUTE
, de sorte que vous n'avez pas à convertir lestimestamp
àtext
et à l'arrière - peut-être en cours d'exécution dans citant questions comme vous l'avez fait. Plus rapide, plus simple, plus sûr.Dans
LANGUAGE plpgsql
,plpgsql
est un mot-clé et ne doit pas être cité.Vous voudrez peut-être vérifier si la table existe déjà avec
CREATE TABLE if not EXISTS
, disponible depuis PostgreSQL 9.1.Apparemment, vous avez besoin de citer backupdays, ou il n'est pas vu comme une chaîne de caractères à partir d'où pour analyser un horodatage.
Vous êtes la construction de SQL à l'aide de la manipulation de la chaîne de sorte que vous avez de bien citer tout comme dans toute autre langue. Il y a un quelques fonctions que vous voulez savoir sur:
quote_ident
: citation d'un identificateur, tel qu'un nom de table.quote_literal
: citation d'une chaîne pour l'utiliser comme une chaîne littérale.quote_nullable
: commequote_literal
mais gère correctement les valeurs Null en tant que bien.Quelque chose de ce genre de serveur, vous mieux:
La
quote_ident
appels ne sont pas nécessaires dans votre cas, mais ils sont une bonne habitude.quote_literal()
etquote_ident()
sont de bons conseils, en général. Dans ce cas, vous n'en avez pas besoin, je dirais. Le nom de la tableaddresstablename
est générée à l'intérieur de la fonction, et ne prend pas la saisie de l'utilisateur, de sorte qu'il peut être utilisé comme il est. La variablebackupdays
peut être appliquée avec leUSING
clause, qui permet d'économiser de moulage et de citer tout à fait.quote_ident
appels ne sont pas nécessaires dans votre cas, mais ils sont une bonne habitude." Je dirais quequote_ident
doit être la valeur par défaut chose que vos doigts, puis supprimez-la si vous êtes certain que vous n'en avez pas besoin.