Retornar multiples registros con un procedimiento almacenado

caicer
14 de Mayo del 2003
Hola

Desarrollè un procedimiento almacenado que me consulta informaciòn de varias tablas, la procesa y finalmente inserta los resultados en una variable tipo TABLA la cual retorna a la aplicacion que llame al procedimiento. Alguna vez observé un procedimento que retornaba varios registros y lo unico que tenia que hacer era invocar al procedimiento almacado con una instrucciòn select, como si este se comportara como una tabla. Como puedo hacer esto?

tbanos
14 de Mayo del 2003
mira ver si te este ejemplo te sirve de guía, aunque no entiendo muy bien lo que quieres. Saludos, Tamara

EJEMPLO:
Vamos a hacer rebajas en las películas que sean anteriores al 01/07/95, para ello crearemos una tabla con dos columnas, para el title_id y para la cantidad que vamos a descontar del precio original.

CREATE TABLE TITLE
(title_id NUMBER(10) CONSTRAINT title_id_pk PRIMARY KEY,
title CHAR(60) NOT NULL,
description CHAR(400),
rating CHAR(4) CONSTRAINT title_rating_ck CHECK(rating IN('G','PG','R','NC17','NR')),
category CHAR(20),CONSTRAINT title_category_ck CHECK(category IN('DRAMA','COMEDY','ACTION','CHILD','SCIFI','DOCUMENTARY')),
release_date DATE);

CREATE TABLE DESCUENTO (title_id NUMBER, rebaja NUMBER);

Tabla creada.

--Creamos un procedimiento que actualizará la columna rebaja, en caso de que ya exista el registro, de lo contrario insertará una fila a partir de la tabla title(que ya existía, te la pongo abajo, vale).

create or replace procedure proc_descuento(p_descuento in number) is

begin

MERGE INTO descuento P
USING (SELECT title_id, prices FROM title
WHERE release_date<'01-07-95') S
ON (P.title_id = S.title_id)
WHEN MATCHED THEN UPDATE SET P.rebaja = S.prices*p_descuento
WHEN NOT MATCHED THEN INSERT (P.title_id, P.rebaja)
VALUES (S.title_id, S.prices*p_descuento);

end proc_descuento;

--Comprobando

EXEC proc_descuento(0.1);

Procedimiento PL/SQL terminado correctamente.

--Como la tabla estaba vacía ha insertado los registros correspondientes

select*
from descuento;

TITLE_ID REBAJA
----- ----------
93 3,5
98 2,9
97 3,5

--Comprobamos ahora que actualiza los registros existentes

EXEC proc_descuento(0.5);

Procedimiento PL/SQL terminado correctamente.

TITLE_ID REBAJA
-------- ----------
93 17,5
98 14,5
97 17,5