Inicio > Bases de Datos, Oracle > Query dinamico en procedimiento almacenado (Oracle).

Query dinamico en procedimiento almacenado (Oracle).

Ayer un usuario de  La Web del programador me contactó porque tenía dudas sobre cómo hacer un Query Dinámico en un procedimiento almacenado en la base de datos, por lo que me gustaría compartir con ustedes la solución, ya que que en su momento yo también anduve buscando por todos lados una solución y no me fué fácil encontrarla.

Personalmente la forma que más utilizo es la siguiente:

DECLARE
  TYPE CUR_TYP IS REF CURSOR;
  c_cursor   CUR_TYP;
  fila PAISES%ROWTYPE;
  v_query     VARCHAR2(255);
BEGIN
  v_query := 'SELECT * FROM PAISES';

  OPEN c_cursor FOR v_query;
  LOOP
    FETCH c_cursor INTO fila;
    EXIT WHEN c_cursor%NOTFOUND;
    dbms_output.put_line(fila.DESCRIPCION);
  END LOOP;
  CLOSE c_cursor;
END;

Tomar en cuenta que  la variable “fila” es de tip “ROWTYPE”,  o sea que contiene los mismos nombres de columnas que los de la tabla y allí es en donde se almacena el resultado del Query.

Espero haberles ayudado en algo, y espero sus comentarios.   !! Saludos !!.

Anuncios
  1. Juan pablo
    noviembre 15, 2008 en 7:40 pm

    Holas.
    Estoy trabajando para un proyecto final en la universidad con Oracle Forms Builder.
    Lo que quiero es hacer una consulta con un procedimiento, este funciona perfecto en SQL*Plus, pero en Forms no.
    Saca un mensaje de error diciendo que se requiere de una tabla oun refcur.
    Que hago?
    Este es el procedimiento:
    prompt Según el código del empleado, muestre el nombre y su pago de este mes, sabiendo
    prompt que la hora cuesta $1800 ,la hora extra $2300 y no se trabaja los domingos.
    create or replace procedure pago (cod IN number, valh IN number, valhe IN number) is
    nom empleado.nombre%type;
    pago number(8);
    h_d pago_nomina.horas_dia%type;
    hor_ext pago_nomina.h_e%type;
    ded pago_nomina.deducciones%type;
    begin
    select e.nombre,p.horas_dia,p.h_e,p.deducciones
    into nom,h_d,hor_ext,ded
    from empleado e, pago_nomina p
    where e.id_empleado=cod and p.id_empleado=cod;
    pago:=(((36*h_d)*valh)+(hor_ext*valhe)-ded);
    dbms_output.put_line(‘El pago de este mes para ‘||nom||’ es $’||pago);
    exception
    when no_data_found then
    dbms_output.put_line(‘El empleado no existe’);
    end;
    /

    Espero ayuda

  2. jdguillen
    noviembre 17, 2008 en 1:13 pm

    Hola Juan Pablo.

    Para poder hacer una consulta en Forms lo puedes hacer de otra manera, debes de crear una nueva forma, sobre la cual debes de crear un nuevo Block de Datos utilizando la tabla principal de consulta como pivote que en éste caso sería la de “empleado” y luego puedes agregar en el canvas los “text_items” que vas a utilizar cómo podrían ser la de Horas por día, Horas extras, deducciones y pagos, para que te haga los cálculos e inserte en éstos campos los resultados puedes utilizar el trigger “Post_Query” a nivel del bloque y en éste insertar el query :

    select e.nombre,p.horas_dia,p.h_e,p.deducciones,(((36*h_d)*valh)+(hor_ext*valhe)-ded) pago
    into :txt_nom,:txt_h_d,:txt_hor_ext,:txt_ded,:txt_pago
    from empleado e, pago_nomina p
    where e.id_empleado=cod and p.id_empleado=cod
    and e.id_empleado=:empleado.cod;

    Y con ésto ya podrías utilizar las funciones que por default trae Oracle Developer para consultar en las formas que son los modos ENTER_QUERY y EXECUTE_QUERY (F7 y F8), lo que quiere decir que si quieres consultar la información de un empleado específicamente tienes que presionar F7 ingresar en el campo código el código del empleado y luego presionas F8 y con ésto tendrás el resultado de tu consulta en la forma.

    Ten cuidado de asegurarte de que los text_items agregados en la forma se llamen igual a : ” :txt_nom, :txt_h_d, :txt_hor_ext, :txt_ded, :txt_pago”

    Saludos.

  3. diciembre 7, 2008 en 12:55 pm

    Donde estoy trabajando actualmente se usa ORACLE lo cual no entendia nada en el principio, pero hoy dia estoy en cursos en la UIC/Oracle University en Chicago esperando que en los proximas semanas pueda manejar mas facil la base de datos y no sea tan confuso como a principio.

    Es mas facil de lo que me supuse al principio y eso que no sere Ingeniero simplemente asistente de gerencia.

    Werner.

  4. ITA
    febrero 11, 2009 en 8:18 am

    IMAGINASE YO QUIERO VER TODO LOS PRODUCTOS VENDIDO EN UN MES !!! EN EL FORM PRECEDENTE YO ELIGO EL MES Y COMO HAGO A QUE EN EL FORM SUCESIVO VEO TODO LOS PRODUCTOS VENDIDO?
    ME PUEDEN DAR UNA IDEA DE COMO SE USA ESE FORM?

  5. jdguillen
    febrero 17, 2009 en 12:15 pm

    Hola ITA.

    Me paréce que el uso de Forms es algo complicado de explicar, ya que es demasiada información, pero, encontré un Link que te puede servir para que aprendas el uso de Developer Forms:

    http://www.mygnet.net/manuales/oracle/oracle_form.608

    Espero que te pueda servir.

    Saludos.

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: