jueves, 25 de octubre de 2012

PL/SQL: RECORRIENDO LOS REGISTROS EN UN CURSOR


Este es un ejercicio sencillo de como recorrer los registros de un cursor. Yo uso un editor para este ejercicio.

Recomiendo que el punto 1 y 2 sea en una pestaña de tu editor mientras que el punto 3  en una pestaña aparte ya que puede adicionar muchos cambios y ejecutarlo.

Pasos:

1. Creamos una tabla ejemplo de nombre M_PRODUCTOS, con los siguientes campos basicos: codigo, descripcion, ingreso_fecha, estado.

2. Agregamos 6 productos

3. Creamos script de consulta al cursor.




/*
1. CREACION DE TABLA
   =================
*/
create table M_PRODUCTOS(
CODIGO VARCHAR2(6),DESCRIPCION VARCHAR2(100), INGRESO_FECHA DATE, ESTADO VARCHAR(1),
CONSTRAINT PK_MPRODCUTOS PRIMARY KEY ( CODIGO )
);


/*
2. AGREGAR NUEVOS REGISTROS
   ========================
*/
INSERT INTO M_PRODUCTOS VALUES('A00001', 'DESARMADOR PLANO', '10/10/2012', 'A');
INSERT INTO M_PRODUCTOS VALUES('A00002', 'DESARMADOR ESTRELLA', '11/10/2012', 'A');
INSERT INTO M_PRODUCTOS VALUES('A00003', 'TALADRO PERCUTOR', '11/10/2012', 'A');
INSERT INTO M_PRODUCTOS VALUES('A00004', 'TALADRO PORTATIL', '12/10/2012', 'A');
INSERT INTO M_PRODUCTOS VALUES('A00005', 'LIJADORA MANUAL', '12/10/2012', 'A');
INSERT INTO M_PRODUCTOS VALUES('A00006', 'CEPILLO METALICO', '15/10/2012', 'A');
COMMIT ;





/*

Aquí viene el 3er paso

*/ 



/*
3. SCRIPT DE CONSULTA AL CURSOR
   ============================
*/


/*SCRIPT */
DECLARE
  /*DECLARAMOS LAS VARIABLES QUE RECIBIRRAN LOS DATOS DEL CURSOR*/
  V_DESCRIPCION M_PRODUCTOS.DESCRIPCION%TYPE;
  V_INGRESO_FECHA M_PRODUCTOS.INGRESO_FECHA%TYPE ;
  /*DECLARAMOS EL CURSOR*/
CURSOR C_PROD  IS SELECT DESCRIPCION, INGRESO_FECHA FROM M_PRODUCTOS ;
BEGIN
  /*<ABRIMOS EL CURSOR*/
  OPEN C_PROD ;
  --- V_ROW_COUNT := C_PROD%ROWCOUNT ;
  /*RECORREMOS EL CURSOR*/
  LOOP
    FETCH C_PROD INTO V_DESCRIPCION,V_INGRESO_FECHA ;
          EXIT WHEN C_PROD%NOTFOUND ;
          DBMS_OUTPUT.PUT_LINE(V_DESCRIPCION ||' , ' ||V_INGRESO_FECHA);
  END LOOP ;
  CLOSE C_PROD ;/*<--- CERRAMOR EL CURSOR*/   
  EXCEPTION
    WHEN OTHERS
      THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END ;


/*
En la parte superior esta el resultado. Hasta la proxima .....
*/

miércoles, 24 de octubre de 2012

POWERBUILDER - ORACLE - PROCEDURE - REF CURSOR -

Aqui un ejemplo sencillo de como llamar un procedimiento almacenado de ORACLE que nos devuelve un REF CURSOR , No lo llamaremos por un datawindow si no lo llamaremos a un cursor dentro de powerBuilder 12 .

Abrimos el ORACLE SQL DEVELOPER, entrar con un usuario de privilegios para para crear tablas y procedimientos. Aqui esta el script:

1. CREACION DE LA TABLA Y DE LOS REGISTROS RESPECTIVOS


CREATE TABLE temp_menu (
                codigo number,
                descripcion varchar2(100),
                orden varchar2(50),
                nivel number,
                apertura varchar2(20),
                objeto varchar2(50));

INSERT INTO temp_menu VALUES (
                1,
                'ARCHIVO',
                '001',
                1,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                2,
                'INICIO',
                '002',
                1,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                3,
                'ENVIAR Y RECIBIR',
                '003',
                1,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                4,
                'CARPETA',
                '004',
                1,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                5,
                'VISTA',
                '005',
                1,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                6,
                'GUARDAR',
                '001001',
                2,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                7,
                'GUARDAR COMO',
                '001002',
                2,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                8,
                'INFORMACION',
                '001003',
                2,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                9,
                'CONFIGURACION DE LA CUENTA',
                '001003001',
                3,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                10,
                'HERRAMIENTAS DE LIMPIEZA',
                '001003002',
                3,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                11,
                'ADMINISTRAR REGLAS Y ALERTAS',
                '001003003',
                3,
                'O',
                NULL);
INSERT INTO temp_menu VALUES (
                12,
                'LIMPIEZA DE BUZON',
                '001003002001',
                4,
                'W',
                NULL);
INSERT INTO temp_menu VALUES (
                13,
                'VACIAR CARPETA ELEMENTO ELIMINADOS',
                '001003002002',
                4,
                'W',
                NULL);
INSERT INTO temp_menu VALUES (
                14,
                'ARCHIVAR',
                '001003002003',
                4,
                'W',
                NULL);
                
                commit ;

2. CREACION DE UN PAQUETE 


create or replace
PACKAGE TIPO_RETORNO AS 
 type CURSOR_DINAMICO is REF CURSOR;
END TIPO_RETORNO;



3. CREACION DE UN PROCEDURE


CREATE OR REPLACE  PROCEDURE SP_MENU
( VO_CURSOR      out TIPO_RETORNO.CURSOR_DINAMICO)
IS
BEGIN
OPEN VO_CURSOR FOR
SELECT orden, descripcion, SUBSTR(orden, 1,3) as origen, nivel,to_number(substr(orden, 1,50))as det1 from temp_menu order by orden asc ;
END ;


4. CREAR APLICATIVO EN POWERBUILDER


En PowerBuilder, creamos una ventana y le adicionamos un Treeview y lo ponemos como nombre tv_dinamico. Para hacer este ejemplo ya se debe tener la conexión establecida con la base de datos.
En el evento OPEN de la ventana que contiene el objeto treeview digitamos lo siguiente:


string ls_orden, ls_descripcion, ls_origen,ls_nivel,det1 
Long  ll_lev0, ll_lev1, ll_lev2
TreeViewItem  ltvi_root, ltvi_node

DECLARE pro_menu PROCEDURE FOR sp_menu USING SQLCA;
EXECUTE pro_menu ;
if SQLCA.SQLcode <> 0 then
                messagebox('error', sqlca.SQLErrText)
end if
FETCH pro_menu INTO :ls_orden, :ls_descripcion, :ls_origen,:ls_nivel,:det1 ;
DO WHILE SQLCA.SQLcode = 0
ltvi_root.Label =ls_descripcion
ll_lev1 = tv_dinamico.InsertItemLast( 0, ltvi_root )
FETCH pro_menu INTO  :ls_orden, :ls_descripcion, :ls_origen,:ls_nivel,:det1 ;
 LOOP;



Y solo ejecutamos y listo. Aqui tengo una imagen sencilla de dicho ejemplo. Lo que deseaba mostrar era el como obtener los registros de un procedure de Oracle asi como el uso del REF CURSOR.