PDA

Ver la Versión Completa : Procedimiento Almacenado con parametros


raorre
30-12-2008, 09:12:13
Buenas..trabajo en firebird 2.1 tengo un procedimiento almacenado donde los parametros de entrada deberian de pasarse como el campo a buscar y la tabla donde buscar, lo que hace este procedimiento en obtener al maximo de la tabla clientes, pero quiero hacerlo general para cualquier tabla.
Como esta abajo funciona, pero si le paso estos parametros me dice que no

FOR SELECT MAX(:CAMPOID) AS REGISTROS FROM :TABLA
Como puedo pasarle los parametros a la tabla y que no me pete, debe ser
un problema de comillas pero no consigo resolverlo.

CREATE PROCEDURE OBTENER_MAXIMO(
TABLA VARCHAR(50) CHARACTER SET NONE COLLATE NONE,
CAMPOID VARCHAR(50) CHARACTER SET NONE COLLATE NONE)
RETURNS(NUMREG INTEGER)
AS
DECLARE VARIABLE CONTADOR INTEGER;
BEGIN
FOR SELECT MAX(ID_CLIENTE) AS REGISTROS FROM TCLIENTES
WHERE 1=1
INTO :CONTADOR DO
BEGIN
IF (:CONTADOR=0) THEN NUMREG=1;
ELSE NUMREG=CONTADOR+1;
SUSPEND;
END
END

duilioisola
30-12-2008, 10:23:26
Creo que esto se puede solucionar con una tabla temporal (temp_id) y la sentencia execute statement.

Lo que hago es insertar el max(campoID) en la tabla temporal y luego hacer un select de ese campo.
Finalmente, lo borro.

CREATE PROCEDURE OBTENER_MAXIMO(
TABLA VARCHAR(50) CHARACTER SET NONE COLLATE NONE,
CAMPOID VARCHAR(50) CHARACTER SET NONE COLLATE NONE)
RETURNS(NUMREG INTEGER)
AS
DECLARE VARIABLE CONTADOR INTEGER;
declare variable sql varchar(1024);
BEGIN
/* Genero el insert */
sql = 'insert into temp_id (id) (select max('||:CAMPOID||') from '||:TABLA||')';

/* Borro antes de insertar. */
/* Si no lo hago podria haber dos valores y dar un error luego (singelton select) */
delete from temp_id;

/* Ejecuto el insert */
execute statement sql;

/* Inicializo contador. Si no se inserta nada, quiero que sea 0 */
/* De lo contrario, el select siguiente podria tener basura */
contador=0;

/* Recupero lo que se ha insertado. El max id de la tabla */
select id from temp_id
into :contador;

/* Borro el contenido */
delete from temp_id;

/* Calculo lo que voy a devolver */
IF (:CONTADOR=0) THEN NUMREG=1;
ELSE NUMREG=CONTADOR+1;

/* Devuelvo valor */
SUSPEND;
END