PDA

Ver la Versión Completa : Ayuda con StoredProced


Sóstrato
13-06-2003, 17:20:25
Saludos,
no encuentro literatura de como usar el StoredProced, alguien me puede ayudar con un ejemplo?.
Tengo un procedimiento en mi base de datos oracle que me devuelve un resultado pasandole ciertos valores. Este resultado lo quiero transferir a un DBEdit.

marto
19-06-2003, 00:20:59
Hola,

En un componente que te permita ejecutar queries (un TQuery, por ejemplo) ejecuta el siguiente codigo:

SELECT MI_PROCEDIMIENTO(PARAM_1, PARAM_2,..., PARAM_N)
FROM DUAL;

Esta quety te devolverá un sólo registro y un campo con el resultado de tu procedimiento.

lanysoft
19-06-2003, 17:16:33
abra ibaccess e inicie un procedimiento almacenado nuevo.
Como vemos, nos escribió una plantilla de código para crear el procedimiento. Este pedazo de código dice así:

CREATE PROCEDURE NEWPROC //( )
//RETURNS ( )
AS
//DECLARE VARIABLE
BEGIN
SUSPEND;
END

Ahora utilizaremos esta plantilla de código para crear nuestro procedimiento. Lo primero que debemos de hacer es cambiar el nombre del procedimiento por algun nombre representativo, por ejemplo: REPORTE_EQUIPO. Para esto, debemos cambiar la línea:

CREATE PROCEDURE NEWPROC //( )

por esta:

CREATE PROCEDURE REPORTE_EQUIPO //( )
En ib access lo anterior no es necesario pero lo dejo como guia.

Los paréntesis que están a continuación son opcionales, pues si tenemos parámetros de entrada, ahí se tienen que especificar. Debido a que nuestro SP no usa parámetros de entrada, los quitaremos, al igual que los caracteres //, ya que se utilizan para indicar que son comentarios.

En la parte que dice RETURNS, deberemos quitar igualmente las barras //, para indicar dentro de los paréntesis de RETURNS los campos que va a regresar nuestro SP. Por lo tanto, deberemos definir los nombres de los campos y los tipos de datos. Como sabemos, necesitamos un campo para el nombre completo, otro para el número de equipos y otro para el precio total, por lo tanto la parte de returns quedará así:

RETURNS (NOMBRECOMPLETO VARCHAR(81), NUMERO_EQUIPOS INTEGER, PRECIO_TOTAL FLOAT)

lo mismo, en ibaccess esto no es necesario pero en otros programas si lo puede ser.

A continuación, declararemos las variables que vamos a necesitar, en este caso son cuatro CNT, donde almacenaremos temporalmente el número de equipos, y luego le asignaremos ese valor a la variable de salida NUMERO_EQUIPOS, CLAVEPER donde almacenaremos la clave de cada persona, NOMBRE1 y APELLIDOS1 para almacenar el nombre y apellidos de cada persona. Entonces las lineas quedarán así:

DECLARE VARIABLE CNT INTEGER;
DECLARE VARIABLE CLAVEPER INTEGER;
DECLARE VARIABLE NOMBRE1 VARCHAR(40);
DECLARE VARIABLE APELLIDOS1 VARCHAR(40);

Y ya estamos listos para empezar a programar nuestro SP.

Después de la instrucción BEGIN, deberemos hacer un select que obtenga todos los registros de la tabla PERSONAS, aunque aquí tendremos que utilizar una instrucción FOR antes del SELECT, de esta manera indicamos una acción que será realizada para cada registro del conjunto de datos obtenido en el SELECT. En este caso, necesitamos las columnas CLAVEPERSONA, NOMBRE y APELLIDOS de la tabla PERSONAS, y deberán guardarse en las variables CLAVEPER, NOMBRE1 y APELLIDOS1.
Por lo tanto la instrucción quedará así:

FOR SELECT CLAVEPERSONA, NOMBRE, APELLIDOS FROM PERSONAS INTO :CLAVEPER, :NOMBRE1, :APELLIDOS1 DO

Nota como se utiliza el FOR para iniciar la instrucción y se termina con DO.
A continuación del DO se puede poner una instrucción o un conjunto de instrucciones (delimitado por un bloque BEGIN END) que serán repetidos para cada elemento del conjunto de datos obtenido con el SELECT.

En este caso, queremos asignar a la variable de salida NOMBRECOMPLETO la concatenación de las variables NOMBRE1 y APELLIDOS1, los cuales tendrán los valores de los campos NOMBRE y APELLIDOS para cada registro del SELECT. Esto se hace con esta instrucción:

NOMBRECOMPLETO = :NOMBRE1||' '||APELLIDOS1;

Ahora necesitaremos hacer un select que nos indique el número de equipos que tiene asignada la persona.

SELECT COUNT(*) FROM EQUIPO WHERE CLAVEPERSONA=:CLAVEPER INTO :CNT;

Y ahora deberemos de preguntar si CNT es mayor que cero, entonces podremos obtener el Precio total de los equipos, con otro SELECT:

IF (:CNT>0) THEN
SELECT SUM(PRECIO) FROM EQUIPO WHERE CLAVEPERSONA=:CLAVEPER INTO :PRECIO_TOTAL;
ELSE PRECIO_TOTAL=NULL;

Finalmente, asignamos el contenido de la variable CNT a la variable de salida NUMERO_EQUIPOS.

NUMERO_EQUIPOS = :CNT;

La instrucción SUSPEND que ya está escrita en la plantilla, sirve para indicar que se debe de regresar un "registro" del SP, con los valores que le asignamos a las variables de salida.

Bueno, pues ahora vamos a ver cómo quedó nuestro SP:

CREATE PROCEDURE REPORTE_EQUIPO
RETURNS (NOMBRECOMPLETO VARCHAR(81), NUMERO_EQUIPOS INTEGER, PRECIO_TOTAL FLOAT)
AS
DECLARE VARIABLE CNT INTEGER;
DECLARE VARIABLE CLAVEPER INTEGER;
DECLARE VARIABLE NOMBRE1 VARCHAR(40);
DECLARE VARIABLE APELLIDOS1 VARCHAR(40);
BEGIN
FOR SELECT CLAVEPERSONA, NOMBRE, APELLIDOS FROM PERSONAS INTO :CLAVEPER, :NOMBRE1, :APELLIDOS1 DO
BEGIN
NOMBRECOMPLETO = :NOMBRE1||' '||APELLIDOS1;
SELECT COUNT(*) FROM EQUIPO WHERE CLAVEPERSONA=:CLAVEPER INTO :CNT;
IF (:CNT>0) THEN
SELECT SUM(PRECIO) FROM EQUIPO WHERE CLAVEPERSONA=:CLAVEPER INTO :PRECIO_TOTAL;
ELSE PRECIO_TOTAL=NULL;
NUMERO_EQUIPOS = :CNT;
SUSPEND;
END
END

tomado de http://www.firebird.com.mx:rolleyes: