PDA

Ver la Versión Completa : Modificando Stored Procedure


duco
19-12-2018, 23:36:43
Buenas noches.
Puedo modificar un Stored procedure con una sentencia SQL iniciada por ALTER PROCEDURE en un Tibquery finalizando con execsql.

Normalmente pruebo la sentencia desde IBexpert y luego la inyecto en el programa Delphi.
En esta ocasión uso 'execute procedure' para ejecutar otro procedimiento dentro del modificado
Desde IBexpert va bien
Pero desde delphi me retorna un error -104, precisamente al ejecutar con execsql el tibquery que modifica el stored procedure justo por el execute procedure

¿A alguien le ha pasado esto?
¿hay mas opciones para modificar un SP desde código Delphi?

Muchas gracias

Un saludo

ecfisa
20-12-2018, 18:54:21
Hola.

Puedo modificar un Stored procedure con una sentencia SQL iniciada por ALTER PROCEDURE en un Tibquery finalizando con execsql.
Si es una pregunta, la respuesta es si.

Un ejemplo usando el componente TIBSQL:

...
begin
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE OR ALTER PROCEDURE CONT( CANT INTEGER )');
IBSQL1.SQL.Add('RETURNS( RESULT INTEGER )');
IBSQL1.SQL.Add('AS');
IBSQL1.SQL.Add('BEGIN');
IBSQL1.SQL.Add(' WHILE ( CANT > 0 ) DO');
IBSQL1.SQL.Add(' BEGIN');
IBSQL1.SQL.Add(' RESULT = CANT;');
IBSQL1.SQL.Add(' CANT = CANT - 1;'); // antes: CANT = CANT - 2
IBSQL1.SQL.Add(' SUSPEND;');
IBSQL1.SQL.Add(' END');
IBSQL1.SQL.Add('END');
IBSQL1.ExecQuery;
end;


Saludos :)

duco
20-12-2018, 23:33:04
Buenas tardes, ecfisa, agradezco tu contestación.

Normalmente es así, tal y como dices.

tengo algunos estored procedures definidos de manera que se anidan y se pueden llamar con la sentencia 'Execute procedure'

ej:

BEGIN
if(cod=0) then
execute procedure damecodigo returning values código;



De forma, al dar un alta o modificación se diferencia en el valor del código, 0, alta y otro procedimiento 'damecodigo' busca un código único

Y así varios mas.


Cuando intento modificar uno de estos procedimientos con otros anidados desde ibexpert va todo bien

Pero si intento modificarlo tal y como planteas con un tibsql ---- retorna un error en ejecución -104 al encontrar la palabra 'execute….


No se porqué ocurre esto, pero ¿hay alguna otra forma de modificar un stored desde código Delphi?


Un saludo

ecfisa
21-12-2018, 19:54:47
Hola.

El código de error SQLCODE -104, puede ser provocado por varios motivos: SQLCODE and GDSCODE Error Codes and Descriptions (https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-appx02-sqlcodes.html).
Revisa cuál de las descripciones de los códigos GDSCODE se aproxima mas al error que pueda estar generando tu código SQL; mas no te puedo decir sin haberlo visto.


Sin embargo, hice dos procedimientos muy elementales para poder probar la modificación del procedimiento cuando existe la declaración EXECUTE PROCEDURE y desde Delphi se modifica sin generar errores:

...
begin
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('CREATE OR ALTER PROCEDURE FOO_MAIN( CANT INTEGER )');
IBSQL1.SQL.Add('RETURNS( RESULT INTEGER )');
IBSQL1.SQL.Add('AS');
IBSQL1.SQL.Add('BEGIN');
IBSQL1.SQL.Add(' WHILE ( CANT > 0 ) DO');
IBSQL1.SQL.Add(' BEGIN');
IBSQL1.SQL.Add(' RESULT = CANT;');
IBSQL1.SQL.Add(' CANT = CANT - 1;'); // antes: CANT = CANT - 2;
IBSQL1.SQL.Add(' EXECUTE PROCEDURE FOO( CANT );');
IBSQL1.SQL.Add(' SUSPEND;');
IBSQL1.SQL.Add(' END');
IBSQL1.SQL.Add('END');
IBSQL1.ExecQuery;
end;


Si tuviera que aventurar un motivo, revisaría el código en busca de alguna dependencia que lo pudiera provocar.

Saludos :)

duco
21-12-2018, 21:57:00
Muchas gracias, ecfisa.

Realmente te lo agradezco, me relaja observar cómo es posible modificar un stored que anide con 'execute procedure'.

Tiene que haber alguna dependencia que no he localizado.

Como imaginas estoy modificando un código que funcionando ha de evolucionar y curiosamente he encontrado el sistema para sin modificar los Stored, lograr la funcionalidad precisada.

Era el caso de eliminar una serie de campos de las tablas y añadir otros.
He generado las nuevas tablas y los nuevos campos y los nuevos stored y
No he eliminado los viejos campos y les asigno valores por defecto que no usaré, sin eliminar las columnas

Así evito reconstruir las tablas y los stored, que van muy bien y es asumible el incremento de tamaño de datos


Muchas gracias

Un saludo