Funcion con Parametro da error

Hola a todos,

Estoy empezando con Knime, y me encontré con el problema de no poder utilizar una funcion almacena en mi servidor de POSTGRESQL, en una sentencia UPDATE, la misma seria la siguiente:

UPDATE tabla
SET campo1 = funcionDevuelveVarchar(campo2); – “no tiene where, porque el update seria a todas las filas”

Para ejecutar esta DML utilizo el nodo DB SQL Executor.
Sin embargo, el nodo da error diciendome que en un loop no puedo asignar un limite NULL. Esto se debe a que obtengo la longitud de campo2 para realizar un FOR, dentro de funcionDevuelveVarchar.
Deduzco que no estoy pasando adecuadamente el parametro a la funcion, ya que no reconoce el contenido del campo…
Aclaro que ejecutando esta funcion en el servidor postgres, funciona correctamente.

Estara bien utilizar este nodo? hay algo que me estoy olvidando?

Gracias a todos.

Saludos

Buenos días @leonardoomar

Entiendo que campo2 es una variable/campo de knime, lo ideal es que sea tipo String (si en sql también fuese no olvides los delimitadores ').

Dentro del Executor lo que construyes es una cadena que envías al servidor de SQL (como si fuera un openquery de sql).

Comprueba/protege también que no haya valores null, eso también te puede provocar ese error.

Un saludo

1 Like

Hola @jmgor , gracias por responder. Te cuento que al final encontre una solucion a mi problema. Paso a detallar :
1- Mi intencion era ejecutar una funcion almacenada en nuestro servidor de Postgresql, la misma empieza asi:

CREATE OR REPLACE FUNCTION public.funciondevuelvevarchar(campo2 character varying)
RETURNS character varying
LANGUAGE plpgsql
AS $function$
declare
letra char;
largo int;
begin
largo := length(campo2); <---- “aca daba error en knime”
for i in 1…largo
loop
letra := substring(campo2,i,1);

Dicha funcion la utlizaría para un DML en un nodo DB SQL Executor, porque no encontre otra manera, entonces la instruccion en dicho nodo seria así:

UPDATE public.tabla
SET campo1 = public.funcionDevuelveVarchar(campo2);

2- Por lo que noté, length() (que devuelve la longitud de un string), desde knime no funciona, vuelvo a aclarar que la funcion funciondevuelvevarchar() esta en el servidor postgres, no es una funcion creada en knime. y campo2 no es una variable de knime, es un campo de una tabla que paso como parametro.
El log de errores en knime, me aclaraba que no se podia asignar NULL a un limite de Loop, y veras que el limite de loop que utilizo es la variable largo que se le asigna un valor entero atraves de length(), pero ésta al no funcionar devuelve un NULL.

3- La solucion??? Fui al servidor postgres y edite la funcion funcionDevuelveVarchar() de la siguiente manera:

En la linea donde decía largo := length(campo2) la modifique a largo := 200;
O sea, a la variable largo le asigne un valor entero fijo… y funcionó para KNIME !

Conclusion… ninguna, no entendi porque la funcion length() de postgres, no se puede ejecutar desde knime, cuando otras funciones como substring() si funcionan…

Pero bueno, finalmente pude solucionarlo

Si a alguien le pasó algo similar, y encontró otra solucion, o la correcta, será bienvenido su aporte.

Gracias a Todos.

Saludos

2 Likes