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