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:
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:
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:
Citation:
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