Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

[SOLUCIONADO] procedimiento almacenado para listar

Estas en el tema de procedimiento almacenado para listar en el foro de Oracle en Foros del Web. Saludos! Necesito hacer un procedimiento almacenado para listar en oracle, pero solo puedo sacar una fila y no varias, como hago para que me devuelva ...
  #1 (permalink)  
Antiguo 12/05/2013, 13:46
Avatar de felipelvrd  
Fecha de Ingreso: diciembre-2012
Mensajes: 28
Antigüedad: 11 años, 4 meses
Puntos: 0
procedimiento almacenado para listar

Saludos!
Necesito hacer un procedimiento almacenado para listar en oracle, pero solo puedo sacar una fila y no varias, como hago para que me devuelva toda una lista?
  #2 (permalink)  
Antiguo 12/05/2013, 15:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: procedimiento almacenado para listar

Primero, muestra lo que tienes. Luego veremos qué aconsejarte.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/05/2013, 17:24
Avatar de felipelvrd  
Fecha de Ingreso: diciembre-2012
Mensajes: 28
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: procedimiento almacenado para listar

algo así:

Código:
create or replace procedure SP_Listar_Cursos(pCodigo out number,
                                             pNombre out varchar2) is
begin

  begin
    select Codigo, Nombre into pCodigo, pNombre from Curso;
  
  end;
end SP_Listar_Cursos;
Solo que manda error porque son varias filas, si es solo una si funciona, se puede hacer que sirva para varias filas? o si se puede hacer en una función?
  #4 (permalink)  
Antiguo 12/05/2013, 19:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: procedimiento almacenado para listar

Primero: Para obtener una salida de más de un registro, te recomiendo usar como parámetro de salida un CURSOR. El cómo se maneja dependerá luego del lenguaje de programación usado en la aplicación.
También puedes usar arrays, según el caso.

Segundo: ¿Función? Creo que no tienes en claro lo que es una función en ningún caso

Una función (recordar matemática) es una operación que devuelve un único valor en base a los parámetros. Un único valor, y por ende no puede devolver un array ni una tabla...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 14/05/2013, 22:39
 
Fecha de Ingreso: mayo-2009
Mensajes: 8
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: procedimiento almacenado para listar

Hola felipelvrd, Te dejo un ejemlo de como debe quedar tu listar el mismo se realizad usando tipos, colecciones y cursores al final devuelve una colección. Tal vez te de una idea.
Código SQL:
Ver original
  1. PROCEDURE P_Listar(
  2.             pv_num_empresa          IN  sgm00tm_det_empresas_usuario.num_empresa%TYPE,
  3.             pv_cod_tipo_presupuesto IN  varchar2,
  4.             pv_des_tipo_presupuesto IN  sgm00tt_sacp_tip_presupuesto_v.des_tipo_presupuesto%TYPE,
  5.             pv_num_pagina           IN  NUMBER,
  6.             pv_reg_presentar        IN  NUMBER,
  7.             pv_accion               IN  NUMBER,
  8.             po_mensaje              OUT varchar2,
  9.             po_arreglo              OUT DM_T_PRESUPUESTO,
  10.             po_total_registros  OUT  NUMBER)
  11. IS
  12.    
  13.     v_tabla        DM_T_PRESUPUESTO := DM_T_PRESUPUESTO(); --esto es una coleccion en oracle la cual debe estar previamente deficina con los campos a mostrar
  14.     v_registro     DM_PRESUPUESTO := DM_PRESUPUESTO(NULL,NULL);
  15.    
  16.     v_Linea        BINARY_INTEGER := 0;
  17.     TYPE CUR_TYP IS REF CURSOR;
  18.     cur_registros  CUR_TYP;
  19.     v_query        VARCHAR2(24000);
  20.  
  21.    v_query :=
  22.             'SELECT * FROM ( SELECT a.*, rownum rnum FROM (
  23.                select  to_char(cod_tipo_presupuesto) as cod_tipo_presupuesto, des_tipo_presupuesto
  24.                from    sgm00tt_sacp_tip_presupuesto_v
  25.                where   nvl(:pv_cod_tipo_presupuesto, cod_tipo_presupuesto) = cod_tipo_presupuesto
  26.                and     upper(nvl(des_tipo_presupuesto, ''|-*-|'')) like ''%''||upper(nvl(:pv_des_tipo_presupuesto, nvl(des_tipo_presupuesto, ''|-*-|'')))||''%''          
  27.            ) a WHERE rownum <= :Final ) WHERE rnum >= :Inicio';
  28.            
  29.     OPEN cur_registros FOR v_query USING
  30.             pv_cod_tipo_presupuesto, pv_des_tipo_presupuesto,
  31.             100000, 1;
  32.            
  33.     LOOP
  34.       FETCH cur_registros INTO
  35.            v_registro.cod_tipo_presupuesto,
  36.            v_registro.des_tipo_presupuesto,
  37.            v_lineas;
  38.     IF (cur_registros%FOUND) THEN
  39.                v_linea := v_linea + 1;
  40.                v_tabla.EXTEND;
  41.                v_tabla(v_linea) := v_registro;
  42.     ELSE
  43.        EXIT;
  44.     END IF;
  45.    
  46.      CLOSE cur_registros;
  47.      po_arreglo := v_tabla;
  48.      
  49.      EXCEPTION
  50.      WHEN OTHERS THEN
  51.           po_mensaje := nvl(f_mensaje_error(pv_num_empresa,substr(sqlcode,2,10)),'Ocurrió un Error a la hora de Consultar: '||sqlerrm);
  52. END P_Listar;

Última edición por gnzsoloyo; 15/05/2013 a las 03:10
  #6 (permalink)  
Antiguo 17/05/2013, 11:23
Avatar de felipelvrd  
Fecha de Ingreso: diciembre-2012
Mensajes: 28
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: procedimiento almacenado para listar

bueno, al final lo resolví con una función que retorna una tabla, según como dice aquí

http://www.java2s.com/Tutorial/Oracle/0540__Function-Procedure-Packages/Returnatablecollection.htm

También probé lo del cursor, pero me gusto mas de la forma anterior.

Etiquetas: procedimiento_almacenado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:51.