Query dinamico en procedimiento almacenado (Oracle).

13 11 2008

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 !!.


Acciones

Información

5 respuestas

15 11 2008
Juan pablo

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

17 11 2008
jdguillen

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.

7 12 2008
werner

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.

11 02 2009
ITA

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?

17 02 2009
jdguillen

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.

Deja un comentario