Retornar multiples registros con un procedimiento almacenado
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?
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?
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
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
