QUE ES UN PROCEDURE, TIPOS Y DIFERENCIA CON EL CURSOR


Un procedimiento es un subprograma que ejecuta una acción especifica y que no devuelve ningún valor. Un procedimiento tiene un nombre, un conjunto de parámetros (opcional) y un bloque de código.
   
La sintaxis de un procedimiento almacenado es la siguiente:

CREATE [OR REPLACE] 
PROCEDURE <procedure_name> [(<param1> [IN|OUT|IN OUT] <type>, 
                             <param2> [IN|OUT|IN OUT] <type>, ...)] 
IS  -- Declaracion de variables localesBEGIN  -- Sentencias[EXCEPTION]  -- Sentencias control de excepcionEND [<procedure_name>];
   
El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el procedimiento existe, se producirá, un error.
   
La sintaxis es muy parecida a la de un bloque anónimo, salvo porque se reemplaza la seccion DECLARE por la secuencia PROCEDURE ... IS en la especificación del procedimiento.
   
Debemos especificar el tipo de datos de cada parámetro. Al especificar el tipo de dato del parámetro no debemos especificar la longitud del tipo.
   
Los parámetros pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT). El valor por defecto es IN, y se toma ese valor en caso de que no especifiquemos nada.

CREATE
OR REPLACE
PROCEDURE Actualiza_Saldo(cuenta NUMBER,
new_saldo NUMBER)
IS -- Declaracion de variables locales
BEGIN
  -- SentenciasUPDATE SALDOS_CUENTAS
SET SALDO = new_saldo,
FX_ACTUALIZACION = SYSDATE

WHERE CO_CUENTA = cuenta;

END Actualiza_Saldo;

    
También podemos asignar un valor por defecto a los parámetros, utilizando la clausula DEFAULT  o el operador de asiganción (:=) .

CREATE
OR REPLACE
PROCEDURE Actualiza_Saldo(cuenta NUMBER,
new_saldo NUMBER DEFAULT 10 )
IS -- Declaracion de variables locales
BEGIN
  -- SentenciasUPDATE SALDOS_CUENTAS
SET SALDO = new_saldo,
FX_ACTUALIZACION = SYSDATE

WHERE CO_CUENTA = cuenta;

END Actualiza_Saldo;


Una vez creado y compilado el procedimiento almacenado podemos ejecutarlo. Si el sistema nos indica que el procedimiento se ha creado con errores de compilación podemos ver estos errores de compilacion con la orden SHOW ERRORS en SQL *Plus.
   
Existen dos formas de pasar argumentos a un procedimiento almacenado a la hora de ejecutarlo (en realidad es válido para cualquier subprograma). Estas son:
  • Notación posicional: Se pasan los valores de los parámetros en el mismo orden en que el procedure los define.
BEGIN Actualiza_Saldo(200501,2500);
        COMMIT;

END;

  • Notación nominal:Se pasan los valores en cualquier orden nombrando explicitamente el parámetro.
BEGINActualiza_Saldo(cuenta => 200501,new_saldo => 2500);COMMIT;
END;

                                        CURSORES EN PROCEDIMIETOS DE SQL
En los procedimientos SQL, un cursor permite definir un conjunto de resultados (un conjunto de filas de datos) y ejecutar lógica compleja en los filas en función de la fila. Utilizando la misma mecánica, un procedimiento SQL también puede definir un conjunto de resultados y devolverlo directamente al llamador del procedimiento SQL o a una aplicación cliente.
Un cursor puede considerarse como un puntero a una fila de un conjunto de filas. El cursor sólo puede hacer referencia a una fila a la vez, pero puede moverse a otras filas del conjunto de resultados según sea necesario.
Para utilizar cursores en procedimientos SQL, debe hacer lo siguiente:
  1. Declare un cursor que defina un conjunto de resultados.
  2. Abra el cursor para establecer el conjunto de resultados.
  3. Extraiga los datos del cursor en variables locales según sea necesario, una fila cada vez.
  4. Cierre el cursor cuando hay terminado
Para trabajar con cursores, debe utilizar las siguientes sentencias SQL:
  • DECLARE CURSOR
  • OPEN
  • FETCH
  • CLOSE
El ejemplo siguiente muestra la utilización básica de un cursor de sólo lectura dentro de un procedimiento SQL:
  CREATE PROCEDURE sum_salaries(OUT sum INTEGER) 
  LANGUAGE SQL
  BEGIN
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
    DECLARE p_sum INTEGER;
    DECLARE p_sal INTEGER;
    DECLARE c CURSOR FOR SELECT SALARY FROM EMPLOYEE;
 
     SET p_sum = 0;

     OPEN c;

     FETCH FROM c INTO p_sal;

     WHILE(SQLSTATE = '00000') DO
        SET p_sum = p_sum + p_sal;
        FETCH FROM c INTO p_sal; 
     END WHILE;

     CLOSE c;

     SET sum = p_sum;

  END%
Este es un ejemplo más complejo de utilización de un cursor dentro de un procedimiento SQL. Este ejemplo muestra el uso combinado de un cursor y sentencias PL SQL.

No hay comentarios.:

Publicar un comentario