IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Caractere echappement (quote) et variables sous pgsql


Sujet :

PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Caractere echappement (quote) et variables sous pgsql
    Bonjour,
    J'ai un problème avec une fonction que j'ai écrite en pgsql sous posgres 8.3.
    En fait, mes variables entre 2 fois 2 simples quotes ne sont pas interprétées en tant que telles mais comme des chaînes de caratères. Cela a pour effet de planter ma requête.
    Ci-dessous la fonction utilisée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    CREATE OR REPLACE FUNCTION ACCT_STOP(TEXT, TEXT, BIGINT, BIGINT, BIGINT, BIGINT, BIGINT, TEXT, INET, TEXT, TEXT, TEXT, INET) RETURNS VOID 
    VOLATILE SECURITY DEFINER LANGUAGE plpgsql AS '
    DECLARE
    date ALIAS FOR $1;
    delaytime ALIAS FOR $2;
    sessiontime ALIAS FOR $3;
    in_gigawords ALIAS FOR $4;
    in_octets ALIAS FOR $5;
    out_gigawords ALIAS FOR $6;
    out_octets ALIAS FOR $7;
    term_cause ALIAS FOR $8;
    ip_address ALIAS FOR $9;
    con_info ALIAS FOR $10;
    session_id ALIAS FOR $11;
    user_name ALIAS FOR $12;
    nas_ip_addr ALIAS FOR $13;
    BEGIN
    UPDATE radacct SET AcctStopTime = (date::timestamp - delaytime::interval),
      AcctSessionTime = CASE WHEN ''sessiontime'' = '''' THEN
      (EXTRACT(EPOCH FROM (date::TIMESTAMP WITH TIME ZONE - AcctStartTime::TIMESTAMP WITH TIME ZONE
      - delaytime::INTERVAL)))::BIGINT ELSE sessiontime END,
      AcctInputOctets = ((in_gigawords::bigint << 32) + in_octets::bigint),
      AcctOutputOctets = ((out_gigawords::bigint << 32) + out_octets::bigint),
      AcctTerminateCause = term_cause,
      AcctStopDelay = 0,
      FramedIPAddress = NULLIF(''ip_address'', '''')::inet,
      ConnectInfo_stop = con_info
      WHERE AcctSessionId = session_id
      AND UserName = user_name
      AND NASIPAddress = nas_ip_addr
      AND AcctStopTime IS NULL;
    IF NOT FOUND THEN RAISE EXCEPTION ''Rien a mettre a jour. Entree introuvable !''; END IF;
        RETURN;
    END
    ';
    Lorsque j'effectue la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ACCT_STOP('2008-09-18 08:20:43', '0', '4',   '0', '78', '0',       '81', '0', '150.0.0.1',         '', '0000000E', '7500000-TDF-0@tdf.fr', '192.168.0.129')
    J'ai l'erreur ci-dessous:
    ERREUR: syntaxe en entrée invalide pour le type inet : « ip_address »
    CONTEXT: instruction SQL « UPDATE radacct SET AcctStopTime = ( $1 ::timestamp - $2 ::interval), AcctSessionTime = CASE WHEN 'sessiontime' = '' THEN (EXTRACT(EPOCH FROM ( $1 ::TIMESTAMP WITH TIME ZONE - AcctStartTime::TIMESTAMP WITH TIME ZONE - $2 ::INTERVAL)))::BIGINT ELSE $3 END, AcctInputOctets = (( $4 ::bigint << 32) + $5 ::bigint), AcctOutputOctets = (( $6 ::bigint << 32) + $7 ::bigint), AcctTerminateCause = $8 , AcctStopDelay = 0, FramedIPAddress = NULLIF('ip_address', '')::inet, ConnectInfo_stop = $9 WHERE AcctSessionId = $10 AND UserName = $11 AND NASIPAddress = $12 AND AcctStopTime IS NULL »
    PL/pgSQL function "acct_stop" line 16 at SQL statement

    Manifestement, les variables "sessiontime" et 'ip_address" sont interprétées comme des chaînes.

    Quelqu'un aurait-il une solution à me proposer ?
    Pour info: Il me semble que je n'ai pas le problème sous postgres 8.2

    Tonio

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Ma réponse arrive un peu tard peut-être....

    Essai de faire un cast explicite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE radacct
         SET AcctStopTime = (date::timestamp - delaytime::interval)
            ,  AcctSessionTime = CASE WHEN CAST(sessiontime AS TEXT)
    etc..

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par tonio.jt Voir le message
    Bonjour,
    Manifestement, les variables "sessiontime" et 'ip_address" sont interprétées comme des chaînes.
    Oui, il faut écrire ces variables sans aucun guillemet ni apostrophe, c'est plus simple et en plus ça marche au lieu de produire des erreurs

Discussions similaires

  1. saisie variables sous SQL - Oracle 10g
    Par info_ora dans le forum Forms
    Réponses: 2
    Dernier message: 23/05/2006, 17h15
  2. Tester l'existance d'un fct ou d'une variable sous Opéra.
    Par mch_27 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/11/2005, 16h35
  3. utilisé une chaine comme un nom de variable sous delphi ?
    Par hatem_info dans le forum Langage
    Réponses: 3
    Dernier message: 11/10/2005, 16h22
  4. [FLASH MX2004] Déclaration de variables sous flash mx
    Par softyClochette dans le forum Flash
    Réponses: 4
    Dernier message: 29/11/2004, 16h11
  5. [caractere]echappement # et servlet
    Par okoax dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 22/04/2004, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo