Nahum:

Primero, supongo que tu infierno de las comillas dobles se refiere al
de las comillas (simples) dobladas. Ojo que las comillas dobles son
las que se usan para identificadores ( " = 034 vs '' = 039 039, con
este font son casi iguales).

On Fri, 28 Jan 2022 at 07:50, Nahum Castro <nahumcas...@gmail.com> wrote:
> Saludos a tod@s.
> Me encontré con un problema en plpgsql
> Cuando necesito agregar a una variable campos con valores que tienen comillas 
> simples, la  función concatenar no funciona.
> variable := 'update tabla tbl set url = 
> concat('http://server.com/algo.php?clave=',''',tbl.clave,''')'
> trate de escapar con los dolares pero no me funciono ni con los ' dobles
....

Tu problema parece el tipico del quote del quote del quote... que es
un follon pero se suele resolver razonablemente usando distinatas
comillas, de las que en sql hay infinitas usando $x$. Ahora no tengo
acceso ha nada para probarlo pero yo probaria algo asi.

1.- Queremos generar un concat que usa comillas simples, usemos $c$
como delimitador en el para evitar problemas ( pongo lo que voy
haciendo entre <<<>>> para verlo.
     
<<<concat($c$http://server.com/algo.php?clave=$c$,$c$'$c$,tbl.clave,$c$'$c$')>>>

Fijate que por si acaso pongo hasta el http.. con $c$ aunque no le hace falta.

2.- Generemos una constante con un update con la estructura anterior,
usemos $UPD$ para eso.
    <<<$UPD$update tabla tbl set url =
concat($c$http://server.com/algo.php?clave=$c$,$c$'$c$,tbl.clave,$c$'$c$')$UPD$>>>

3.- Hagamos una funcion que usa esa constante, usemos $funcion$ para ella:
<<<$funcion$
BEGIN
  ....
  variable: = $UPD$update tabla tbl set url =
concat($c$http://server.com/algo.php?clave=$c$,$c$'$c$,tbl.clave,$c$'$c$')$UPD$
  ....
END
$funcion$>>>

Como te digo no tengo acceso a un server ahora, pero ese tipo de cosa
es lo que uso habitualmente para estos problemas en lenguajes que
disponen de ese tipo de "comillas gordas" ( $xx$, que hay
construcciones similares en varios lenguages ). Ir por capas y cambiar
la comilla a usar en cada nivel.

Cuando lo genero automaticamente normalmente uso escapes ( \ ), pero
el generador automatico no tiene problemas de ir comprobando y siempre
mete el numero correcto de ellos, las comillas gordas se inventaron
para resolver este tipo de problemas. No colisionan y cada paso de
interpretacion va pelando una capa de forma predecible.,

Por cierto, fijate que no es que la funcion de concatenar falle, sino
que parece que no estas consiguiendo generar la llamada adecuadamente,
en estos casos es mejor que pongas un trozo mas autocontenido, tipo
"estoy haciendo una funcion CREATE FUNCTION ..... variable:=........."
y no consigo que vaya, incluso si puedes que hagas un sample de una
linea para probar/discutir sobre el. ( como reducirla a un
variable:=..., RAISE NOTICE '<<<%>>>0, variable ).

Francisco Olarte.


Reply via email to