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:
Lorsque j'effectue la requête suivante:
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 ';
J'ai l'erreur ci-dessous:
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')
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
Partager